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 }
posted @ 2012-07-31 10:31  Naix_x  阅读(299)  评论(0编辑  收藏  举报