通过观察发现其规律符合杨辉三角

需要注意的是最后ai的系数是C(i-1,n-1)

那么,问题就可以变成判断C(0,n-1),C(1,n-1)。。。。C(n-1,n-1)哪些是m的倍数

只需要计算出m的唯一分解式中各个素因子在C(i-1,n-1)中的指数即可完成判断

然而为了节省时间,实际上我们只需算出m的每一个素因子在C(i-1,n-1)项中  含有几个即可

即我们将c(i-1,n-1)依次除以m的每一个素因子,直到无法整出,即可得出该项素因子的个数

紫薯上给出一个公式C(k,n)=(n-k+1)*c(k-1,n)/k

可以用这个公式递推出所要求出的素因子的个数

具体怎么做呢?

说明:f[i].first中存的时m的素因子,f[i].second中存的是其对应的个数

d[i]用来存c(i-1,n-1)中素因子的个数

int d[50]={0};
for (int k=;k<=n;k++){
int x=n-k+;
for (int i=;i<f.size();i++){
int p=f[i].first;
d[i]+=x/p;
x%=p;
}
x=k-;
for (int i=;i<f.size();i++){
int p=f[i].first;
d[i]-=x/p;
x%=p;
}
int flag=;
for (int i=;i<f.size();i++){
if (d[i]<f[i].second) {flag=;break;}
}
if (flag) cout<<k<<" ok"<<endl;else cout<<"no"<<endl;
}

注意精度问题,所以采用分开除的方法。例外注意是利用的d[i]这个数组的生存周期是在总的循环里实现的递推

这里给出网上某大神的优秀代码

转:http://blog.csdn.net/u014800748/article/details/43927205

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<algorithm>
#include<string>
#include<sstream>
#include<set>
#include<vector>
#include<stack>
#include<map>
#include<queue>
#include<deque>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<ctime>
#include<functional>
using namespace std; #define N 100005
int fac[][];//一张表,fac[i][0]存放素因数,fac[i][1]存放其指数
int fac_c[];
int a[N]; void factor(int m)//分解m
{
int&num = fac[][];//fac[0][0]是表头,存放总的个数,用引用比较方便
num = ;
for (int i = ; i*i <= m;i++)
if (m%i == )
{
fac[++num][] = i;
fac[num][] = ;
do
{
fac[num][]++;
m /= i;
} while (m%i == );//将i除干净
}
if (m > )//如果分解到最后m仍然大于1,说明它是一个素数。注意:如果只是判断素因子有哪些,可以没有此处判断,否则必须有此步
{
fac[++num][] = m;
fac[num][] = ;
}
} bool check(int n, int j)//按照递推公式来计算第j项,检查唯一分解式的指数
{
int num = fac[][];
int a = n - j;//其实是((n-1)+j+1)化简后的结果
int b = j;
for (int i = ; i <= num; i++)
{
int p = fac[i][];
int&q = fac_c[i];
for (; a%p == ; a /= p, q++);//为了提高效率,只用检验m的分解式中的素因数即可
for (; b%p == ; b /= p, q--);
}
for (int i = ; i <= num;i++)
if (fac[i][] > fac_c[i])
return false;
return true;
} int main()
{
//freopen("test.txt", "r", stdin);
int n, m;
while (cin >> n >> m)
{
int cnt = ;
factor(m);
memset(fac_c, , sizeof(fac_c));
for (int i = ; i < n;i++)//直接检查1到n-1项(从0开始)
if (check(n, i))
a[cnt++] = i + ;
printf("%d\n", cnt);
for (int i = ; i < cnt; i++)
printf("%s%d", i == ? "" : " ", a[i]);
printf("\n");
}
return ;
}

UVa1635 - Irrelevant Elements的更多相关文章

  1. UVA1635 Irrelevant Elements —— 唯一分解定理 + 二项式定理

    题目链接:https://vjudge.net/problem/UVA-1635 (紫书320) 题解: 1.根据二项式定理, 可得递推公式: C(n,k) = (n-k+1)/k * C(n, k- ...

  2. UVA1635 Irrelevant Elements(唯一分解定理 + 组合数递推)

    http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=51196 紫书P320; 题意:给定n个数a1,a2····an,依次求出相邻 ...

  3. Irrelevant Elements UVA - 1635 二项式定理+组合数公式+素数筛+唯一分解定理

    /** 题目:Irrelevant Elements UVA - 1635 链接:https://vjudge.net/problem/UVA-1635 题意:給定n,m;題意抽象成(a+b)^(n- ...

  4. POJ2167 Irrelevant Elements

    Time Limit: 5000MS   Memory Limit: 65536KB   64bit IO Format: %lld & %llu Description Young cryp ...

  5. POJ 2167 Irrelevant Elements 质因数分解

    Irrelevant Elements Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 2231   Accepted: 55 ...

  6. 【UVa1635】Irrelevant Elements - 唯一分解定理

    题意 给你 \(n\) 个数,每次求出相邻两个数的和组成新数列.经过 \(n-1\) 次操作后,得到一个数.求这个数 \(mod \ m\) 与哪些项无关. 如:当 \(m=2 \ , \ n=2\) ...

  7. Irrelevant Elements, ACM/ICPC NEERC 2004, UVa1635

    这种题目最重要的是思路了清晰 #include <cstdio> #include <cstring> ;//sqrt(n)+1 is enough ][]; ]; int a ...

  8. Irrelevant Elements UVA-1635 (二项式定理)

    vjudge链接 原题链接 乍一看似乎没什么思路,但是写几个简单的例子之后规律就变得很明显. 比如当 n=5 时,每一步计算后的结果如下: a1 a1+a2 a1+2a2+a3 a1+3a2+3a3+ ...

  9. UVA 1635 Irrelevant Elements

    https://vjudge.net/problem/UVA-1635 题意:n个数,每相邻两个求和,最后变成1个数,问这个数除m的余数与第几个数无关 n个数使用次数分别为C(n-1,i) i∈[0, ...

随机推荐

  1. 201521123007《Java程序设计》第4周学习总结

    1. 本周学习总结 1.1 尝试使用思维导图总结有关继承的知识点. 1.2 使用常规方法总结其他上课内容. 1.1有关继承的知识点: 1.2有关多态 多态性:相同的形态,不同的行为.体现在相同的方法名 ...

  2. 201521123034 《Java程序设计》第3周学习总结

    1. 本章学习总结 看不清点这个:http://naotu.baidu.com/file/c01303326572f7916e506ec5f55270a4 2. 书面作业 1.代码阅读 public ...

  3. Python中库或者模组的解释

  4. 201521123111《Java程序设计》第13周学习总结

    本次作业参考文件 正则表达式参考资料 1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 2. 书面作业 1. 网络基础 1.1 比较ping www.bai ...

  5. 201521123044 《Java程序设计》第11周学习总结

    1. 本章学习总结 2. 书面作业 本次PTA作业题集多线程 1.互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) 1.1 除了使用synchronized修饰方法实现互斥同步访问, ...

  6. sscanf和正则表达式

    sscanf() - 从一个字符串中读进与指定格式相符的数据.      函数原型: Int sscanf( string str, string fmt, mixed var1, mixed var ...

  7. 前端angularJS利用directive实现移动端自定义软键盘的方法

    最近公司项目的需求上要求我们iPad项目上一些需要输入数字的地方用我们自定义的软键盘而不是移动端设备自带的键盘,刚接到需求有点懵,因为之前没有做过,后来理了一下思路发现这东西也就那样.先看一下实现之后 ...

  8. Activiti-04-.Spring integration

    ProcessEngineFactoryBean <beanid="processEngineConfiguration"class="org.activiti.s ...

  9. Python: 列表注意细节与元组的基本用法

    列表注意细节: 1.list.clear():将列表中成员清空(与del list区别开) 2.list.copy():复制一份相同的列表(浅COPY,只复制列表第一层) 3.如果两个列表相等,如li ...

  10. Fiddler抓包工具使用详解

    一.Fiddler简介 Fiddler是最强大最好用的Web调试工具之一, 它能记录所有客户端和服务器的http和https请求.允许你监视.设置断点.甚至修改输入输出数据.Fiddler包含了一个强 ...