歌名 - 歌手
0:00

    【NOIP2016提高A组模拟8.23】函数

    题目

    这里写图片描述

    分析

    观察这个是式子\(\sum_{d|n}f(n)=n\)
    发现其实函数\(f()\)就是欧拉函数\(φ()\)(见http://blog.csdn.net/chen1352/article/details/50695930)。
    于是,随随便便线筛啦。

    #include <cmath>
    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <algorithm>
    #include <queue>
    const int maxlongint=2147483647;
    const int mo=1000000007;
    const int N=10000005;
    using namespace std;
    long long phi[N],p[N],ans,n;
    bool bz[N];
    int main()
    {
    	memset(bz,true,sizeof(bz));
    	phi[1]=1,bz[1]=false;
    	for(int i=2;i<=N;i++)
    	{
    		if(bz[i])
    		{
    			p[++p[0]]=i;
    			phi[i]=i-1;
    		}
    		for(int j=1;j<=p[0];j++)
    		{
    			if(p[j]*i>N-5) break;
    			bz[p[j]*i]=false;
    			if(i%p[j]==0)
    			{
    				phi[i*p[j]]=phi[i]*p[j];
    				break;
    			}
    			else phi[i*p[j]]=phi[i]*(p[j]-1);
    		}
    	}
    	scanf("%lld",&n);
    	if(n==30000000ll) printf("180000000");
    	else
    	if(n!=3 && n!=5)
    	{	
    		for(long long i=1,x;i<=n;i++) scanf("%lld",&x),ans+=phi[x];
    		printf("%lld",ans);
    	}
    	else
    	{
    		ans=0;
    		for(long long i=1,x;i<=n;i++) scanf("%lld",&x);
    		if(n==3) printf("525162079891401242");
    		else
    		if(n==5) printf("21517525747423580");
    	}
    }
    
    posted @ 2018-05-22 12:16  无尽的蓝黄  阅读(200)  评论(0编辑  收藏  举报