1. 程式人生 > >poj2480 Longge's problem

poj2480 Longge's problem

esp mat std var log pri phi div cst

欲求 \(\sum_{i=1}^n (i,n)\)

顯然 \((i,n) \mid n\)。記 \(d=(i,n)\),枚舉 \(d\),有多少個 \(i \in [1,n]\) 使得 \((i,n)=d\) 呢?換句話說有多少個 \(i \in [1,\lfloor n/d \rfloor]\) 使得 \((i,\lfloor n/d \rfloor) = 1\) 呢?顯然是 \(\varphi(\lfloor n/d \rfloor)\) 個。

答案就是 \(\sum_{d|n}d\cdot \varphi(n/d)\)

#include <iostream>
#include <cstdio>
using namespace std; typedef long long ll; ll n, T; ll ans; ll phi(ll x){ ll re=x; for(ll i=2; i*i<=x; i++) if(x%i==0){ re = re / i * (i - 1); while(x%i==0) x /= i; } if(x>1) re = re / x * (x - 1); return re; } int main(){ while(scanf("
%d", &n)!=EOF){ ans = 0; for(ll i=1; i*i<=n; i++) if(n%i==0){ ans += (ll)i * phi(n/i); if(i*i!=n) ans += (ll)(n/i) * phi(i); } printf("%lld\n", ans); } return 0; }

poj2480 Longge's problem