Longge’s problem
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
数论还是难呀,看了一下午终于看懂了。
官方解析如下:
但是,依旧看不懂AC代码。
我们通过一系列证明:(不会Latex的弱鸡)
代码如下:
#include <iostream>
using namespace std;
typedef long long ll;
int main()
{
ll n;
while(cin>>n){
ll ans=n;
for(ll i=2;i*i<=n;i++){
if(n%i==0){
ll a=0,p=i;
while(n%p==0){
a++;
n/=p;
}
ans=ans+ans*a*(p-1)/p;
}
}
if(n!=1)
ans=ans+ans*(n-1)/n;
cout<<ans<<endl;
}
return 0;
}