POJ 2048 Longge's problem (歐拉函數 積性函數)

Longge's problem

Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 7550   Accepted: 2500

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

2
6

Sample Output

3
15

Source

POJ Contest,Author:Mathematica@ZSU

題解:

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int main(){
	long long n,i,phi;
	while(scanf("%lld",&n)!=EOF){
		phi=1;
		for(i=2;i*i<=n;i++){
			if(n%i!=0)
			   continue;
			long long p=0,t=1;
			while(n%i==0){
				n=n/i;
				p++;
				t=t*i;
			}
			phi=phi*(p*(t-t/i)+t);//F[p^k]=k*(p^k-p^(k-1))+p^k(p爲質數)
		}
		if(n!=1){
			phi=phi*(2*n-1);
		}
		printf("%lld\n",phi); 
	}
}

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章