1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #define M 50009 5 #define ll long long 6 using namespace std; 7 int n,a,b,c,d,k,mo[M+5],zhan[M],cnt,sum[M]; 8 bool mark[M+5]; 9 void mobiwus() 10 { 11 mo[1]=1; 12 for(int i=2;i<=M;i++) 13 { 14 if(!mark[i]) 15 { 16 mo[i]=-1; 17 zhan[++cnt]=i; 18 } 19 for(int j=1;zhan[j]*i<=M&&j<=cnt;j++) 20 { 21 mark[zhan[j]*i]=1; 22 if(i%zhan[j]) 23 mo[i*zhan[j]]=mo[i]*mo[zhan[j]]; 24 else 25 mo[i*zhan[j]]=0; 26 } 27 } 28 } 29 ll su(int n,int m) 30 { 31 n/=k; 32 m/=k; 33 if(n>m) 34 swap(n,m); 35 int ans=0,last; 36 for(int i=1;i<=n;i=last+1) 37 { 38 last=min(n/(n/i),m/(m/i)); 39 ans+=(ll)(n/i)*(m/i)*(sum[last]-sum[i-1]); 40 } 41 return ans; 42 } 43 int main() 44 { 45 mobiwus(); 46 for(int i=1;i<=M;i++) 47 sum[i]=sum[i-1]+mo[i]; 48 scanf("%d",&n); 49 for(int i=1;i<=n;i++) 50 { 51 scanf("%d%d%d%d%d",&a,&b,&c,&d,&k); 52 printf("%lld\n",su(b,d)-su(a-1,d)-su(b,c-1)+su(a-1,c-1)); 53 } 54 return 0; 55 }
莫比乌斯反演