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 }

 

你可能感兴趣的:(Prim)