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

Posted 小小AI,请多多提携

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了三行写出莫比乌斯函数(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 }

 

以上是关于三行写出莫比乌斯函数(HDU1695)的主要内容,如果未能解决你的问题,请参考以下文章

HDU-1695(莫比乌斯反演)

HDU1695GCD(莫比乌斯反演)

HDU 1695 莫比乌斯思想基础题

hdu1695(莫比乌斯反演)

hdu1695 GCD(莫比乌斯入门题)

莫比乌斯反演HDU1695_GCD