UVA 12465 - The Turanga Leela Problem(求某个数的约数个数)
算是 有公式把。一个数的可以化成,素数相乘的形式,约数个数 = 每个素数的次幂+1的乘积。
知道了这个,还有3个需要注意。。。。我竟然错了9次。。。哭死了。。。。
注意 1 的情况特判。 注意在sqrt(N)的范围以外的素数,直接输出2。含有sqrt(N)范围以外的的素数的 约数的非素数,找的时候特判一下,最后结果*2;
1 #include <stdio.h> 2 #include <string.h> 3 #include <math.h> 4 #define eps 0.00000001 5 int p[100001],o[4001],k[4000]; 6 int main() 7 { 8 long long a,b,sum; 9 int i,j,n,z; 10 n = (int)sqrt(1000000002+eps); 11 for(i = 2; i <= n; i ++)//筛选素数 12 { 13 if(p[i] == 0) 14 { 15 for(j = i+i; j <= n; j += i) 16 p[j] = 1; 17 } 18 } 19 j = 1; 20 for(i = 2; i <= n; i ++)//存素数 21 { 22 if(!p[i]) 23 { 24 o[j] = i; 25 j ++; 26 } 27 } 28 while(scanf("%lld%lld",&a,&b)!=EOF) 29 { 30 if(a == 0&&b == 0) 31 break; 32 memset(k,0,sizeof(k)); 33 if(a - b < 0) 34 a = b - a; 35 else 36 a = a - b; 37 if(a == 1)//特判 38 { 39 printf("1\n"); 40 continue; 41 } 42 z = 1; 43 for(i = 1; i <= j-1; i ++)//特判 44 { 45 if(a%o[i] == 0) 46 { 47 a = a/o[i]; 48 k[i] ++; 49 z = 0; 50 break; 51 } 52 } 53 if(z) 54 printf("2\n"); 55 else 56 { 57 sum = 1; 58 while(a > 1) 59 { 60 z = 1; 61 for(i = 1; i <= j-1; i ++) 62 { 63 if(a%o[i] == 0) 64 { 65 a = a/o[i]; 66 k[i] ++; 67 z = 0; 68 break; 69 } 70 } 71 if(z)//特判 72 { 73 sum = 2; 74 break; 75 } 76 } 77 for(i = 1; i <= j-1; i ++) 78 { 79 if(k[i] != 0) 80 sum *= k[i]+1; 81 } 82 printf("%lld\n",sum); 83 } 84 } 85 return 0; 86 }