三行写出莫比乌斯函数(HDU1695)

莫比乌斯函数是可以在三行内写出来的

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 const int maxn=1000000;
 5 int mu[maxn+10],T;
 6 void Mobius(){
 7     for(int d=1,k;d<=maxn;++d)
 8         for(mu[1]=1,k=d<<1;k<=maxn;mu[k]=mu[k]-mu[d],k+=d);
 9     for(int i=1;i<=maxn;++i)mu[i]+=mu[i-1];
10 }
11 int main(){
12     Mobius();
13     ios::sync_with_stdio(false);
14     cin>>T;
15     for(int kase=1,a,b,c,d,k;kase<=T;++kase){
16         cin>>a>>b>>c>>d>>k;
17         if(!k){
18             cout<<"Case "<<kase<<": 0"<<endl;
19             continue;
20         }
21         b/=k;d/=k;
22         if(b>d)b^=d^=b^=d;
23         ll ans1=0,ans2=0;
24         for(int i=1,t;i<=b;i=t+1){
25             t=min(b/(b/i),d/(d/i));
26             ans1+=1ll*(mu[t]-mu[i-1])*(b/i)*(d/i);
27         }
28         for(int i=1,t;i<=b;i=t+1){
29             t=b/(b/i);
30             ans2+=1ll*(mu[t]-mu[i-1])*(b/i)*(b/i);
31         }
32         ans1-=ans2/2;
33         cout<<"Case "<<kase<<": "<<ans1<<endl;
34     }
35 }

 

posted @ 2017-08-25 21:15  人棍王楼下的AI  阅读(196)  评论(0编辑  收藏  举报