同样是容斥原理,我昨晚调了大半天TAT,最后才发现数据范围少看了个0。。0.0真是醉了

另外还有个问题,这能用phi么。。。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<queue>
 4 #include<algorithm>
 5 #include<iostream>
 6 #define inc(i,l,r) for(i=l;i<=r;i++)
 7 #define dec(i,a,b) for(i=a;i>=b;i--)
 8 #define inf 1e9
 9 #define NM 100000+5
10 #define mem(a) memset(a,0,sizeof(a))
11 using namespace std;
12 bool v[NM];
13 int f[NM],p[NM],i,j,k,n,x,T,u,a,b,c,d;
14 long long ans;
15 long long work(int x,int m){
16     int t=0;
17     long long ans=0;
18     if(x==0||m==0)return 0;
19     if(x==1)return m;
20     if(!v[x])f[++t]=x;
21     else{
22         inc(j,1,n)
23         if(x%p[j]==0){
24             f[++t]=p[j];
25             while(x%p[j]==0)x/=p[j];
26             if(!v[x]){
27                 if(x>1)f[++t]=x;
28                 break;
29             }
30         }
31     }
32     inc(j,1,(1<<t)-1){
33         int s=1,r=0;
34         inc(k,0,t-1)
35         if(j&(1<<k)){
36             r++;s*=f[k+1];
37         }
38         if(r&1)ans+=m/s;else ans-=m/s;
39     }
40     return m-ans;
41 }
42 void init(){
43     v[1]++;
44     inc(i,2,100000)
45     if(!v[i]){
46         p[++n]=i;
47         inc(j,2,100000/i)v[i*j]++;
48     }
49 }
50 int main(){
51     init();
52     scanf("%d",&T);
53     inc(u,1,T){
54     scanf("%d%d%d%d%d",&a,&b,&c,&d,&k);
55     printf("Case %d: ",u);
56     if(k==0||b<k||d<k){
57         printf("0\n");
58         continue;
59     }
60     a=max(b,d);
61     b=min(b,d);
62     a/=k;b/=k;
63     ans=(long long)a;
64     inc(i,2,b)ans+=work(i,a)-work(i,i-1);
65     printf("%lld\n",ans);
66     }
67     return 0;
68 }
View Code

 

posted on 2015-08-10 11:30  onlyRP  阅读(153)  评论(1编辑  收藏  举报