• 题解:艾米利亚的求助


    题目:http://cojs.tk/cogs/problem/problem.php?pid=2431

    题解:

       其实这道题真心简单,不要被数据范围迷惑。

    对于F(x)函数,我们把x分解为p1^a1*p2^a2*……*pn^an

    F(x)=(a1+1)*(a2+1)*……*(an+1); 

             直接枚举N的因子,已知N的因子个数是logN个,所以后面的就直接暴力就可以了,效率是log(N)*,10^15可以过掉

    #include <cstdio>
    #include <cmath>
    using namespace std;
    typedef long long ll;
    const int MAXN=10000005;
    ll N,Ans,tot;
    ll ans_1[MAXN],ans_2[MAXN],Tmp[MAXN];
    ll Phi(ll x){
    	ll res=x,k=sqrt(x);
    	for(int i=2;i<=k;++i){
    		if(x%i==0){
    			res-=res/i;
    			while(x%i==0)x/=i;
    		}
    	}
    	if(x>1)res-=res/x;
    	return res;
    }
     
    ll F(ll x){
    	Tmp[0]=0;
    	int k=sqrt(x);
    	ll ans=1;
    	for(int i=2;i<=k;i++){
    		while(x%i==0){
    			Tmp[++Tmp[0]]=i;
    			x/=i;
    		}
    	}
    	if(x>1)Tmp[++Tmp[0]]=x;
    	if(!Tmp[0])return 0;
    	for(int i=1,j=i;i<=Tmp[0];i++){
    		j=i;
    		while(Tmp[j] == Tmp[j+1] && j<Tmp[0])j++;
    		ans*=(j-i+2); i=j;
    	}
    	return ans;
    }
     
    int main(){
    	freopen("aimiliyadehelp.in","r",stdin);
    	freopen("aimiliyadehelp.out","w",stdout);
    	scanf("%lld",&N);
    	int k=sqrt(N);
    	for(int i=1;i<=k;++i){
    		if(N%i==0){
    			ans_1[++ans_1[0]]=i;
    			if(i*i!=N)ans_1[++ans_1[0]]=N/i;
    		}
    	}
    	for(int i=1;i<=ans_1[0];++i)
    		Ans+=F(ans_1[i])*Phi(N/ans_1[i]);
    	printf("%lld
    ",Ans);
    	fclose(stdin);
    	fclose(stdout);
    	return 0;
    }


    人就像命运下的蝼蚁,谁也无法操控自己的人生.
  • 相关阅读:
    文本信息检索基本知识【转】
    单纯形【转】
    云飘忽不定?且看多种多样的云存储应用【转】
    海量数据来临 分层存储才是解决之道【转】
    伽玛函数_gamma
    设计模式理解创建模式
    Memory management demo from TCPL
    Welcome to asm!
    Monokai scheme for Qt
    Astyle for qtcreator
  • 原文地址:https://www.cnblogs.com/Skyminer/p/6435561.html
Copyright © 2020-2023  润新知