zoukankan      html  css  js  c++  java
  • 题解:艾米利亚的求助

    题目: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;
    }


    人就像命运下的蝼蚁,谁也无法操控自己的人生.
  • 相关阅读:
    myeclipse项目转到eclipse中
    线程防止冲突
    Flex FLOWBOX 添加RichText 不换行
    win7 修复系统文件
    一月学习socket tcp通信总结
    flex
    [调试技巧] 如何利用WinDbg找出程序崩溃的位置
    Class Struct 转Byte Serialize Marshal 区别
    C#捕获摄像头进行拍照和录像资料总结
    WebBrowser控件使用技巧分享
  • 原文地址:https://www.cnblogs.com/Skyminer/p/6435561.html
Copyright © 2011-2022 走看看