【原创】【组合数学】Uva1635 无关的元素
2017-07-09 10:09
260 查看
无关的元素
时间限制: 1 Sec 内存限制: 128 MB题目
题目描述
对于给定的n个数a1,a2,…,an,依次求出相邻两数之和,将得到一个新数列。重复上述操作,最后结果将变成一个数。问这个数除以m的余数与哪些数无关?例如n=3,m=2时,第一次求和得到a1+a2,a2+a3,再次求和得到a1+2a2+a3,它除以2的余数和a2无关。
输入
第1行:2个整数n和m(1<=n<=10^5, 2 <=m<=10^9)输出
按升序列出与m无关的元素的序号,每行1个。若与全部元素无关,输出0
样例输入
5 3样例输出
3分析
在手动推了很多几次以后,我们可以鲸讶地发现,合并之后的系数就是杨辉三角!也就是组合。所以说,题目变成了杨辉三角第n层有几个数被m整除。
当然,肯定不能直接求杨辉三角。
杨辉三角第i排第j个的值实际上是C[i-1,j-1],
而组合数有这样一个公式:C[n,k]=C[n,k-1]*(n-k+1)/k
//n的含义发生改变
如果C[n,k]整除m,则C[n,k-1]也整除m。//以上言论没有经过验证
所以只需看(n-k+1)/k是否整除m。//但这句话是正确的
判断整除,可以分解质因数之后比较质因数的个数。
注意,C[n,k]的质因数个数是要继承C[n,k-1]的!!!
//我就是这里没搞懂
代码
#include<cstdio> #include<iostream> using namespace std; #define ll long long int p[100],cm[100],cc[100],cnt,n,m; bool ch(int a,int b) { int x,y; x=a-b+1; y=b; for(int i=1;i<=cnt;i++) { //cc[i]=0; while(x%p[i]==0) x/=p[i],cc[i]++; while(y%p[i]==0) y/=p[i],cc[i]--; } for(int i=1;i<=cnt;i++) if(cc[i]<cm[i]) return 0; return 1; } int main() { scanf("%d %d",&n,&m); for(int i=2;i*i<=m&&m>1;i++) if(m%i==0) { p[++cnt]=i; while(m%i==0) m/=i,cm[cnt]++; } if(m>1) cnt++,p[cnt]=m,cm[cnt]++; bool flg=0; for(int i=2;i<=n;i++) if(ch(n-1,i-1)) printf("%d\n",i),flg=1; if(!flg) puts("0"); return 0; } ////C[n,k]=C[n,k-1]*(n-k+1)/k;
相关文章推荐
- 唯一分解式,二项式定理(无关的元素,uva 1635)
- irrelevant Elements (组合数学)uva-1635
- 【数论】Irrelevant Elements, ACM/ICPC NEERC 2004, UVa1635 【组合数学】
- 例题10-6 无关的元素 UVa1635
- 紫书 例题10-6 无关的元素 UVa1635
- 【学校OJ】组合数学 无关的元素
- UVa 1635 无关的元素(唯一分解定理+二项式定理)
- (组合数学3.1.1.2)UVA 10098 Generating Fast(使用字典序思想产生所有序列)
- (组合数学3.1.1.2)UVA 10098 Generating Fast(使用字典序思想产生所有序列)
- (组合数学3.3.2.2)UVA 10497 - Sweet Child Makes Trouble(特殊的排列问题——错排方案数)
- UVALive 7040 Color 容斥原理 + 组合数学递推公式 +lucas
- 组合数学-两类元素的全排列
- UVa 11038 - How Many O's? (组合数学 数位统计)
- UVa 10892 - LCM Cardinality (因式分解 组合数学)
- uva 11609 - Teams(组合数学+快速幂)
- UVa 11401 - Triangle Counting (组合数学)
- UVA 19889 组合数学
- 无关的元素(排列与组合) By ACReaper
- UVALive 6909 Kevin's Problem 数学排列组合
- Uva 11076 Add Again 解题报告(组合数学)