题目大意
给定一个整数 N ,你需要求出 ∑Ni=1gcd(i,N)
Data Constraint
0<N≤232
题解
设N的一个约数
k
则
=∑k∗(gcd(N/k,M/k)==1)
=∑k∗phi(N/k)
SRC
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std ;
typedef long long ll ;
ll n , m ;
ll ans ;
ll phi( ll x ) {
ll ret = x ;
for (int i = 2 ; i <= m ; i ++ ) {
if ( x % i ) continue ;
ret = ret * (i - 1) / i ;
while ( x % i == 0 ) x /= i ;
}
if ( x > 1 ) ret = ret * (x - 1) / x ;
return ret ;
}
int main() {
scanf( "%lld" , &n ) ;
m = sqrt( n ) ;
for (int i = 1 ; i <= m ; i ++ ) {
if ( n % i ) continue ;
ans += i * phi( n / i ) ;
if ( (ll) i * i <= n ) ans += (n / i) * phi( i ) ;
}
printf( "%lld\n" , ans ) ;
return 0 ;
}
以上.