hdu 4135 Co-prime 容斥原理

简单的容斥原理!!!

代码如下:

 

 1 #include<iostream>
 2 #include<stdio.h>
 3 #include<cstring>
 4 #include<algorithm>
 5 #define I(x) scanf("%d",&x)
 6 #define ll __int64
 7 #define MAX 500000
 8 using namespace std;
 9 int prime[MAX],cnt,e[MAX],num;
10 ll a,b,res1,res2;
11 bool f[MAX];
12 void init()
13 {
14     cnt=0;
15     memset(f,0,sizeof(f));
16     for(int i=2;i<MAX;i++){
17         if(!f[i]) prime[cnt++]=i;
18         for(int j=0;j<cnt&&i*prime[j]<MAX;j++){
19             f[i*prime[j]]=1;
20             if(i%prime[j]==0) break;
21         }
22     }
23 }
24 void fac(ll n)
25 {
26     num=0;
27     for(int i=0;i<cnt&&prime[i]*prime[i]<=n;i++){
28         if(n%prime[i]==0){
29             e[num++]=prime[i];
30             n/=prime[i];
31             while(n%prime[i]==0) n/=prime[i];
32         }
33     }
34     if(n>1) e[num++]=n;
35 }
36 void dfs(ll sum,int d,int c,ll &ans,ll n)
37 {
38     if(sum>n) return;
39     ans-=(ll)(n/sum*c);
40     for(int i=d+1;i<num;i++)
41         dfs((ll)sum*e[i],i,-c,ans,n);
42 }
43 int main(){
44     int t,ca=0;
45     ll n;
46     init();
47     I(t);
48     while(t--){
49         scanf("%I64d%I64d%I64d",&a,&b,&n);
50         fac(n);
51         res1=a-1;
52         res2=b;
53         for(int i=0;i<num;i++){
54             dfs(e[i],i,1,res1,a-1);
55             dfs(e[i],i,1,res2,b);
56         }
57         printf("Case #%d: %I64d\n",++ca,res2-res1);
58     }
59     return 0;
60 }
View Code

 

 

posted @ 2013-09-01 14:39  _随心所欲_  阅读(176)  评论(0编辑  收藏  举报