标签:
链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&category=850&problem=4510
题意:一组数字a1,a2,a3.......,不断的相邻数成一组求和形成新的一组,直到最后不可以在合并为止,问最后的答案对m取模与哪些初始的项的无关?
题解:显然无关就是要求某一项在最终的数列中的系数是m的倍数,并且显然最终系列的系数是二项分布,那么问题就转化为了如何快速求得所有二项分布的系数中
是某一个特定数字倍数的个数。第一个要解决的问题是高精度,以唯一质数分解定理解决。第二个要解决的问题是复杂度,用快速求下一项的c(n,k)=c(n,k-1)*(n-k+1)/k公式解决,并且以素因子作为循环的第一重,逐个在所有的系数中除比较快。
//做了这题才发现对于质数分解定理实现的理解有误,不需要先把素数打表。
代码:
1 #include <cstdio> 2 #include <cmath> 3 #include <cstring> 4 #include <iostream> 5 #include <algorithm> 6 #include <set> 7 #include <vector> 8 #include <queue> 9 #include <map> 10 #include <stack> 11 typedef long long ll; 12 using namespace std; 13 #define test freopen("1.txt","r",stdin) 14 const int inf=0x3f3f3f3f; 15 const ll infll = 0x3f3f3f3f3f3f3f3fLL; 16 vector<int>primes; 17 void prime_factors(int n) { 18 int m = floor(sqrt(n) + 0.5); 19 for(int i = 2; i <= m; i++) { 20 if(n % i == 0) { // еÄËØÒò×Ó 21 primes.push_back(i); 22 while(n % i == 0) n /= i; 23 } 24 } 25 if(n > 1) primes.push_back(n); 26 } 27 const int maxn=400000; 28 bool bad[maxn]; 29 int main() 30 { 31 int n,m; 32 while(cin>>n>>m) 33 { 34 primes.clear(); 35 prime_factors(m); 36 n--; 37 memset(bad,0,sizeof(bad)); 38 for(int i=0;i<primes.size();i++) 39 { 40 int p=primes[i],e=0; 41 int min_e=0,x=m; 42 while(x%p==0){x/=p;min_e++;} 43 for(int k=1;k<n;k++) 44 { 45 x=n-k+1; 46 while(x%p==0) x/=p,e++; 47 x=k; 48 while(x%p==0) x/=p,e--; 49 if(e<min_e)bad[k]=1; 50 } 51 } 52 vector<int>ans; 53 for(int k=1;k<n;k++) 54 if(!bad[k]) ans.push_back(k+1); 55 cout<<ans.size()<<endl; 56 if(!ans.empty()) { 57 cout << ans[0]; 58 for(int i = 1; i < ans.size(); i++) cout << " " << ans[i]; 59 } 60 cout<<endl; 61 } 62 return 0; 63 }
uva 1635 - Irrelevant Elements
标签:
原文地址:http://www.cnblogs.com/diang/p/4792737.html