首页 > 代码库 > hdu Co-prime

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         else53         {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

 

hdu Co-prime