求莫比乌斯函数μ(n)模板:
const int Max=1e7+10;
bool ver[Max];
int mo[Max],prim[Max],ans=0;
void set_mobius(int n)
{
memset(ver,false,sizeof(ver));
mo[1]=1;
for(long long i=2;i<n;i++)
{
if(!ver[i])
{
ver[i]=true;
prim[ans]=i;
ans++;
mo[i]=-1;
}
for(long long j=0;j<ans&&prim[j]*i<n;j++)
{
if(prim[j]*i<=n)
{
ver[prim[j]*i]=true;
if(i%prim[j]==0)
{
break;
}
else
{
mo[i*prim[j]]=-mo[i];
//mo[i*prim[j]]=mo[i]*mo[prim[j]];
}
}
}
}
}
题目地址:https://vjudge.net/contest/436024#problem/F
ac代码:
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
const int Max=1e7+10;
bool ver[Max];
int mo[Max],prim[Max],ans=0;
void set_mobius(int n)
{
memset(ver,false,sizeof(ver));
mo[1]=1;
for(long long i=2;i<n;i++)
{
if(!ver[i])
{
ver[i]=true;
prim[ans]=i;
ans++;
mo[i]=-1;
}
for(long long j=0;j<ans&&prim[j]*i<n;j++)
{
if(prim[j]*i<=n)
{
ver[prim[j]*i]=true;
if(i%prim[j]==0)
{
break;
}
else
{
mo[i*prim[j]]=-mo[i];
//mo[i*prim[j]]=mo[i]*mo[prim[j]];
}
}
}
}
}
int main()
{
set_mobius(Max);
long long t,n;
cin>>t;
long long sum;
while(t--)
{
cin>>n;
sum=0;
for(long long i=1;i<=n/i;i++)
if(mo[i])
sum+=n/i/i*mo[i];
cout<<sum<<endl;
}
return 0;
}