bzoj2818 Gcd

来源:互联网 发布:网络摄像头安装方案 编辑:程序博客网 时间:2024/05/16 02:58

题目

bzoj第一题,竟然不是1000,233,自己也是可以的。。

经典莫比乌斯反演。。。

#include<iostream>#include<algorithm>#include<cstdio>#include<cstdlib>#include<string>#include<cstring>#include<cmath>#define MAXN 10000000#define LL long longusing namespace std;bool P[MAXN+1],flag;int mu[MAXN+1];char s[21];LL len;LL x,y;LL prime[MAXN+1],size;LL N;LL ans;void write(int x){    len=0;    flag=true;    if(x<0)flag=false,x=-x;    if(x==0)putchar('0');    while(x!=0)    {        s[++len]=x%10+'0';        x=x/10;    }    if(!flag)putchar('-');    for(int i=len;i>=1;i--)        putchar(s[i]);    putchar('\n');}int main(){    scanf("%d",&N);    memset(P,true,sizeof(P));    P[1]=false;    for(LL i=2;i<=N;i++)    {        if(P[i])        {            {                for(LL j=i*i;j<=N;j+=i)                    P[j]=false;            }        }    }    for(LL i=1;i<=N;i++)        mu[i]=1;    for(LL i=2;i<=N;i++)    {        if(P[i])        {            mu[i]=-1;            for(LL j=i+i;j<=N;j+=i)            {                if((j/i)%i==0)mu[j]=0;                    else mu[j]=-mu[j];            }        }    }    size=0;    for(LL i=1;i<=N;i++)    {        if(P[i])            prime[++size]=i;    }    ans=0;    for(LL i=1;i<=size;i++)    {        for(LL j=1;j<=N/prime[i];j++)            ans=ans+mu[j]*(N/(j*prime[i]))*(N/(j*prime[i]));    }    cout<<ans;    return 0;} 
原创粉丝点击