首页 > 代码库 > POJ 2480
POJ 2480
可以容易得知,F=sum(p*phi(n/p))。思路就断在这里了。。。
看过别人的,才知道如下:
由于gcd(i,n*m)=gcd(i,m)*gcd(i,n),所以gcd为积性函数。而积性函数之和为积性函数。
所以F=sum(gcd(i,n))为积性函数。n=p1^k1*p2^k2....所以f(p1^k1)*f(p2^k2)...=F。
而f(p^r)由最初公式知f(p^r)=r*(p^r-p^(r-1))+p^r。代入以上公式即可求得。
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#define LL __int64using namespace std;int main(){ LL n; while(scanf("%I64d",&n)!=EOF){ LL ans=1; for(LL i=2;i*i<=n;i++){ LL r=0,p=1; if(n%i==0){ while(n%i==0){ p*=i; r++; n/=i; } ans*=(r*(p-p/i)+p); } } if(n>1){ ans*=(1*(n-1)+n); } printf("%I64d\n",ans); } return 0;}
POJ 2480
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。