POJ 2480 BZOJ 2705 Longge的问题

来源:互联网 发布:sql 将竖列字段拼接 编辑:程序博客网 时间:2024/06/10 02:02

Description

Longge is good at mathematics and he likes to think about hard mathematical problems which will be solved by some graceful algorithms. Now a problem comes: Given an integer N(1 < N < 2^31),you are to calculate ∑gcd(i, N) 1<=i <=N. 

"Oh, I know, I know!" Longge shouts! But do you know? Please solve it. 

Input

Input contain several test case. 
A number N per line. 

Output

For each N, output ,∑gcd(i, N) 1<=i <=N, a line

Sample Input

26

Sample Output

315

Source

POJ Contest,Author:Mathematica@ZSU

(POJ的描述比较生动有趣,就贴了POJ的~)

(翻译见BZOJ 2705~)

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

(思路见:http://www.cnblogs.com/JS-Shining/archive/2012/05/14/2500661.html ,我承认我确实没想出来,证明过程太清真了~)

欧拉函数,居然是欧拉函数的变形......[害怕]

分解n得k|n,则题目变为求k*φ(n/k)~

然后就套欧拉函数~

恩,大概思路就是这样~

(似乎要求对函数理解透彻~然而我还远远没有达到那样的层次~)


#include<cstdio>#define ll long longll ans,n,a;int main(){while(scanf("%lld",&n)!=EOF){ans=n;for(ll i=2;i*i<=n;i++){if(n%i==0){a=0;while(n%i==0){a++;n/=i;} ans+=ans*a*(i-1)/i;} }if(n!=1) ans=ans*(n*2-1)/n;printf("%lld\n",ans);}return 0;}


1 0
原创粉丝点击