bzoj2705 [SDOI2012]Longge的问题

来源:互联网 发布:sql 查询表的所有列名 编辑:程序博客网 时间:2024/05/20 10:13

题目

简单题,狄利克雷卷积一下就好了。

最开始我还以为线性筛就可以了。怕是失了智。

#include<bits/stdc++.h>using namespace std;long long n,m,ans;inline char nc(){    static char buf[100000],*p1=buf,*p2=buf;    return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;}inline long long read(){    long long x=0,b=1;    char c=nc();    for(;!(c<='9'&&c>='0');c=nc())if(c=='-')b=-1;    for(;c<='9'&&c>='0';c=nc())x=x*10+c-'0';    return x*b;}inline long long phi(long long x){    long long tmp=x;    for(long long i=2;i<=m;i++)    {        if(x%i)continue;        tmp=tmp/i*(i-1);        while(x%i==0)x/=i;    }    if(x>1)tmp=tmp/x*(x-1);    return tmp;}int main(){    freopen("in.txt","r",stdin);    n=read();    m=sqrt(n);    for(int i=1;i<=m;i++)    {        if(n%i)continue;        ans+=n/i*phi(i);        if(i*i<n)ans+=i*phi(n/i);    }    cout<<ans;    return 0;}
原创粉丝点击