hdu4135(容斥原理)

题目连接:HDU - 4135

开始学容斥原理

 1 #include<cstdio>
 2 #include<cstring>
 3 #define LL long long
 4 const int maxn=100;
 5 
 6 LL prime[maxn];
 7 LL a,b,n;
 8 LL func(LL up,int m)
 9 {
10     LL ans=0,temp=1;
11     int flag;
12     for(LL i=1;i<(1ll<<m);i++)
13     {
14         temp=1,flag=0;
15         for(int j=0;j<m;j++) if(i&(1ll<<j))
16             ++flag,temp*=prime[j];
17         if(flag&1)  //容斥原理,奇加偶减
18             ans+=up/temp;
19         else ans-=up/temp;
20     }
21     return ans;
22 }
23 
24 int factor(LL n)  //对n进行素数分解
25 {
26     int num=0;
27     for(LL i=2;i*i<=n;i++) if(n&&n%i==0)
28     {
29         prime[num++]=i;
30         while(n&&n%i==0) n/=i;
31     }
32     if(n>1)
33         prime[num++]=n;
34     return num;
35 }
36 int main()
37 {
38     int t;
39     scanf("%d",&t);
40     for(int i=1;i<=t;i++)
41     {
42         int num=0;
43         scanf("%lld%lld%lld",&a,&b,&n);
44         num=factor(n);
45         LL ans=(b-func(b,num))-(a-1-func(a-1,num));
46         printf("Case #%d: %lld\n",i,ans);
47     }
48 }

 

posted @ 2017-05-02 13:57  yijiull  阅读(147)  评论(0编辑  收藏  举报