状态压缩
其实刚开始没看懂为什么要用位运算
后来看了别人的注释
逐渐明白
我也加上注释吧
1 #include <iostream> 2 using namespace std; 3 4 long long Prime[50];//存放N的质因子 5 6 7 long long getNonCoPrime(long long num,int m)//计算非互质数的多少 8 { 9 long long ans=0,flag,temp; 10 for(long long i =1;i<(long long)(1<<m);i++)//用二进制串来表示每个质因子是否被取 11 { 12 temp = 1; 13 flag = 0; 14 for(int j = 0;j<m;j++)//判断每位是否取到 15 { 16 if(i&((long long)(1<<j)))//如果取了 17 { 18 flag++; 19 temp*=Prime[j]; 20 } 21 } 22 if(flag&1)//容斥原理 ,奇加偶减 23 { 24 ans+=num/temp; 25 }else{ 26 ans-=num/temp; 27 } 28 29 } 30 return ans; 31 } 32 33 34 int main() 35 { 36 int T; 37 cin>>T; 38 int t =T; 39 40 while(T--) 41 { 42 long long A,B; 43 int N; 44 cin>>A>>B>>N; 45 int j =0; 46 for(int i = 2;i*i<=N;i++)//获得质因子 47 { 48 if(N&&N%i==0) 49 { 50 Prime[j]=i; 51 j++; 52 while(N&&N%i==0)//避免重复 53 { 54 N/=i; 55 } 56 } 57 } 58 if(N>1) 59 Prime[j++]=N; 60 long long result = B-A-(getNonCoPrime(B,j) -getNonCoPrime(A-1,j))+1; 61 cout<<"Case #"<<t-T<<": "<<result<<endl; 62 } 63 return 0; 64 }
原文地址:http://www.cnblogs.com/Run-dream/p/3859345.html