您的位置:首页 > 其它

URAL 1049 Brave balloonists【数论】

2010-10-09 19:51 543 查看
题目地址:

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: }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: