URAL 1049 Brave balloonists【數論】

題目地址:

http://acm.timus.ru/problem.aspx?space=1&num=1049

題目大意:

給10個數,a[i]<=10000,求a[1]*a[2]*······*a[10]的因子個數。

解題思路:

直接乘肯定不行的,會達到10^40次方。每個a[i]計算因子個數,直接相乘的話會重複計算。每個合數都可以表示成若干素數的乘積, 若

知a=p1^b1  *  p2^b2  *  p3^b3  *  ······  *  pn^bn, 則a的因子個數sum=(1+b1)*(1+b2)*(1+b3)*······*(1+bn),其中pi爲素數。

證明:pi爲素數,任意的i,j有gcd(pi^bi, pj^bj)==1, pi^bi的因子個數爲(1+bi), pj^bj的因子個數爲(1+bj),且兩個因子集合中的數相乘,不會出現重複。

代碼:

  1: #include <cstdio>
  2: #include <cmath>
  3: #include <cstring>
  4: #define maxn 10005
  5: int p[maxn],vis[maxn];
  6: void Prime(){
  7: 	int i,j,k=0;
  8: 	for(i=2;i<=10000;i++){
  9: 		if(!vis[i])p[k++]=i;
 10: 		for(j=0;j<k&&i*p[j]<=10000;j++){
 11: 			vis[p[j]*i]=1;
 12: 			if(!(i%p[j]))break;
 13: 		}
 14: 	}
 15: }
 16: 
 17: int main()
 18: {
 19: 	Prime();
 20: 	int m,i,j,ans;
 21: 	memset(vis,0,sizeof(vis));
 22: 	for(i=1;i<=10;i++){
 23: 		scanf("%d",&m);
 24: 		j=0;
 25: 		while(m>1){
 26: 			if(m%p[j]==0){
 27: 				m/=p[j];
 28: 				vis[p[j]]++;
 29: 			}
 30: 			else j++;
 31: 		}
 32: 	}
 33: 	ans=1;
 34: 	for(i=0;i<maxn;i++)
 35: 		if(vis[i])
 36: 			ans*=(vis[i]+1);
 37: 	printf("%d/n",ans%10);
 38: 	return 0;
 39: }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章