bzoj 2190

2190

 

思路:

  欧拉函数;

 

代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
int n,ans,prime[50001],num_prime=0,m;
bool if_prime[50001];
void euler(int limit)
{
    for(int i=2;i<=limit;i++)
    {
        if(!if_prime[i]) prime[++num_prime]=i;
        for(int j=1;prime[j]*i<=limit&&j<=num_prime;j++)
        {
            if_prime[i*prime[j]]=true;
            if(i%prime[j]==0) break;
        }
    }
}
int main()
{
    scanf("%d",&n),euler(n);
    int now,dis;double pos,tmp;
    for(int i=1;i<n;i++)
    {
        pos=i,now=i;
        for(int v=1;prime[v]<=now&&v<=num_prime;v++)
        {
            if(now%prime[v]==0)
            {
                tmp=prime[v],pos=pos/tmp*(tmp-1);
                while(now%prime[v]==0) now/=prime[v];
            }
        }
        ans+=pos;
    }
    cout<<ans*2+1;
    return 0;
}

 

posted @ 2017-08-09 10:15  IIIIIIIIIU  阅读(200)  评论(0编辑  收藏  举报