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

 

 

你可能感兴趣的:(Prim)