1085. Longge's problem
Constraints
Time Limit: 1 secs, Memory Limit: 32 MB
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
A number N per line.
Output
For each N, output ,∑gcd(i, N) 1<=i <=N, a line .
Sample Input
2 6
Sample Output
315
// Problem#: 1085 // Submission#: 3257689 // The source code is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License // URI: http://creativecommons.org/licenses/by-nc-sa/3.0/ // All Copyright reserved by Informatic Lab of Sun Yat-sen University #include <stdio.h> int main() { //std::ios::sync_with_stdio(false); long long N, ans, kn, pnkn; while (scanf("%lld", &N) != EOF) { ans = 1; for (long long int i = 2; i * i <= N; i++) { if (N % i == 0) { kn = 0, pnkn = 1; while (N % i == 0) { pnkn *= i; kn++; N /= i; } ans *= kn * (pnkn - pnkn / i) + pnkn; } } printf("%lld\n", ans * (2 * N - 1)); } //getchar(); //getchar(); return 0; }