Longge的问题
问题描述
Longge
的数学成绩非常好,并且他非常乐于挑战高难度的数学问题。
现在问题来了:给定一个整数
N
,你需要求出
输入描述
一个整数,为 N 。
输出描述
一个整数,为所求的答案。
样例输入
6
样例输出
15
HINT
对于
对于 100% 的数据, 0<N<=232 。
Solution
设
x1
,
x2
,
x3
,……,
xk
为
n
的
显然, f(1)=φ(n) 。
那么,如何计算 f(k) (k>1) 呢?
∵ gcd(j,n)=i (1<=j<=n)⇒gcd(ji,ni)=1⇒f(i)=φ(ni)
∴ ans=∑ki=1φ(nxi)⋅xi 。
Code
- #include <iostream>
- #include <cstdio>
- #include <cmath>
- #define LL long long
- using namespace std;
- LL n,sqr,ans;
- LL phi(LL x){
- LL tmp=x,tmp2=x,sqr=(LL)sqrt((double)x);
- for(LL i=2;i<=sqr;i++){
- if(x%i==0){
- tmp=tmp*(i-1)/i;
- while(x%i==0)x/=i;
- }
- }
- if(x!=1)tmp=tmp*(x-1)/x;
- return tmp;
- }
- int main(){
- scanf(”%lld”,&n);
- sqr=(LL)sqrt((double)n);
- for(LL i=1;i<=sqr;i++)
- if(!(n%i)){
- ans+=i*phi(n/i);
- if(i!=n/i)ans+=(n/i)*phi(i);
- }
- printf(”%lld\n”,ans);
- return 0;
- }