BZOJ 2190 仪仗队

Posted on 2016-10-16 12:33  ziliuziliu  阅读(125)  评论(0编辑  收藏  举报

莫比乌斯反演。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 40000
using namespace std;
int n,prime[maxn],top=0,miu[maxn+50];
bool vis[maxn+50];
void get_table()
{
    miu[1]=1;
    for (int i=2;i<=maxn;i++)
    {
        if (!vis[i])
        {
            miu[i]=-1;
            prime[++top]=i;
        }
        for (int j=1;j<=top && i*prime[j]<=maxn;j++)
        {
            vis[i*prime[j]]=true;
            if (i%prime[j]) miu[i*prime[j]]=-miu[i];
            else {miu[i*prime[j]]=0;break;}
        }
    }
    for (int i=1;i<=n;i++) miu[i]+=miu[i-1];
}
int main()
{
    scanf("%d",&n);n--;
    get_table();
    int l=1,r,ans=0;
    while (l<=n)
    {
        r=n/(n/l);
        ans+=(miu[r]-miu[l-1])*(n/l)*(n/l);
        l=r+1;
    }
    printf("%d\n",ans+2);
    return 0;
}