Total Submission(s): 7529 Accepted Submission(s): 2773
Please notice that, (x=5, y=7) and (x=7, y=5) are considered to be the same.
Yoiu can assume that a = c = 1 in all test cases.
Each case contains five integers: a, b, c, d, k, 0 < a <= b <= 100,000, 0 < c <= d <= 100,000, 0 <= k <= 100,000, as described above.
#include<iostream> #include<algorithm> #include<stdio.h> #include<string.h> #include<stdlib.h> #include<math.h> #include<vector> #include<queue> #include<stack> #include<map> #define N 101000 using namespace std; vector<int>q[N]; int num[N]; int a,b,c,d,k; void init(){ for(int i=0;i<=N;i++){ q[i].clear(); } for(int i=1;i<=100000;i++){ int p = i; int pi = sqrt(p); for(int j=2;j<=pi;j++){ if(p%j == 0){ q[i].push_back(j); while(p%j == 0){ p = p/j; } } } if(p!=1){ q[i].push_back(p); } } } __int64 IEP(int ii,int pn){ int pt = 0; __int64 s = 0; num[pt++] = -1; for(int i=0;i<q[ii].size();i++){ int l = pt; for(int j=0;j<l;j++){ num[pt++] = num[j]*q[ii][i]*(-1); } } for(int i=1;i<pt;i++){ s += pn/num[i]; } return s; } int main(){ int T; init(); int kk = 0; scanf("%d",&T); while(T--){ scanf("%d%d%d%d%d",&a,&b,&c,&d,&k); if(b>d){ int e = b; b = d; d = e; } if(k == 0){ printf("Case %d: 0\n",++kk); continue; } b = b/k; c = b+1; d = d/k; __int64 sum = 0; for(int i=1;i<=b;i++){ sum += b - IEP(i,b); } sum = (sum+1)/2; for(int i=1;i<=b;i++){ sum += d - c + 1 - IEP(i,d) + IEP(i,c-1); } printf("Case %d: %I64d\n",++kk,sum); } return 0; }