hdu Co-prime

题意:求出在一个区间[A,B]内与N互质的个数 。

思路:

先求出n的质因子,然后求出与N的质因子不互质的个数然后总个数减去就是。用位运算二进制表示那个因子用到过,实现容斥原理。在1到n之间是c倍数的个数为n/c;

 1 #include <cstdio>

 2 #include <cstring>

 3 #include <algorithm>

 4 #define LL __int64

 5 using namespace std;

 6 

 7 int t;

 8 LL a,b,n;

 9 LL f[1000];

10 int cnt;

11 

12 void inti()

13 {

14     memset(f,0,sizeof(f));

15     cnt=0;

16     for(int i=2; i*i<=n; i++)

17     {

18         if(n%i==0)

19         {

20            f[cnt++]=i;

21            while(n%i==0)

22            {

23                n=n/i;

24            }

25         }

26     }

27     if(n>1)

28     {

29         f[cnt++]=n;

30     }

31 }

32 

33 LL Get_num(LL m)

34 {

35     LL ans=0;

36     for(int i=1; i<(1<<cnt); i++)

37     {

38         int xx=0;

39         LL x=1;

40         for(int j=0; j<cnt; j++)

41         {

42             if(i&(1<<j))

43             {

44                xx++;

45                x*=f[j];

46             }

47         }

48         if(xx%2!=0)

49         {

50             ans+=m/x;

51         }

52         else

53         {

54             ans-=m/x;

55         }

56     }

57     return m-ans;

58 }

59 

60 int main()

61 {

62     scanf("%d",&t);

63     for(int cas=1; cas<=t; cas++)

64     {

65         scanf("%I64d%I64d%I64d",&a,&b,&n);

66         inti();

67         printf("Case #%d: %I64d\n",cas,Get_num(b)-Get_num(a-1));

68     }

69     return 0;

70 }
View Code

 

你可能感兴趣的:(Prim)