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 }

莫比乌斯反演

posted on 2016-03-20 23:03  xiyuedong  阅读(140)  评论(0编辑  收藏  举报