HDU 4135

状态压缩

其实刚开始没看懂为什么要用位运算

后来看了别人的注释

逐渐明白

我也加上注释吧

 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 }
posted @ 2014-07-21 22:12  Run_dream  阅读(194)  评论(0编辑  收藏  举报