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

 

posted @ 2014-11-18 20:17  null1019  阅读(117)  评论(0编辑  收藏  举报