題目地址:
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: }