hdu4135Co-prime(容斥原理)

http://acm.hdu.edu.cn/showproblem.php?pid=4135

交了十几次,。最后发现理解错题意了,区间包含右端点,一直按不包含做的。。

求出N的质因数 根据容斥原理解出区间数能被质因数整除的 再减掉

View Code
 1 #include <iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<cstring>
 5 using namespace std;
 6 #define LL __int64
 7 LL sum1,sum2,a,b,n;
 8 int g,x[1001];
 9 void dfs(int i,LL y,int num)
10 {
11     int j;
12     if(y!=x[i])
13     y = y*x[i];
14     if(num%2!=0)
15     {
16         sum1+=(a-1)/y;
17         sum2+=b/y;
18     }
19     else
20     {
21         sum2-=b/y;
22         sum1-=(a-1)/y;
23     }
24     for(j = i+1 ; j <= g ; j++)
25     dfs(j,y,num+1);
26 }
27 int main()
28 {
29     int t,i,j,k = 0;
30     cin>>t;
31     while(t--)
32     {
33         k++;
34         scanf("%I64d%I64d%I64d",&a,&b,&n);
35         sum1 = 0;
36         sum2 = 0;
37         g = 0;
38         x[g] = 0;
39         LL yy = n;
40         for(i = 2 ; i <= sqrt(yy*1.0) ; i++)
41         {
42            if(n%i==0)
43            {
44                g++;
45                x[g] = i;
46                while(n%i==0)
47                n = n/i;
48            }
49         }
50         if(n!=1)
51         {
52             g++;
53             x[g] =n;
54         }
55         for(i = 1; i <= g ; i++)
56         dfs(i,x[i],1);
57         printf("Case #%d: ",k);
58         LL sum = b-sum2-(a-1-sum1);
59         printf("%I64d\n",sum);
60     }
61     return 0;
62 }

 

posted @ 2012-10-11 08:36  _雨  阅读(192)  评论(0编辑  收藏  举报