2705: [SDOI2012]Longge的問題
Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 1638 Solved: 1030
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
Sample Output
HINT
【數據範圍】
對於60%的數據,0<N<=2^16。
對於100%的數據,0<N<=2^32。
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <vector>
#include <queue>
#include <algorithm>
#define LL long long
using namespace std;
const int MAXN = 1000000 + 10;
int read()
{
int x = 0, f = 1; char ch = getchar();
while(ch < '0' || ch > '9'){if(ch == '-') f *= -1; ch = getchar();}
while(ch >= '0' && ch <= '9'){x = x * 10 + ch - '0'; ch = getchar();}
return x * f;
}
int euler(int n)
{
int m = (int) sqrt(n + 0.5);
int ans = n;
for(int i=2;i<=m;i++) if(n % i == 0)
{
ans = ans / i * (i - 1);
while(n % i == 0) n /= i;
}
if(n > 1) ans = ans / n * (n - 1);
return ans;
}
int main()
{
int n; n = read();
long long ans = 0;
for(int i=1;i*i<=n;i++)
{
if(n % i == 0)
{
ans += i * euler(n / i);
if(n / i != i)
ans += (n / i) * euler(i);
}
}
printf("%lld\n", ans);
return 0;
}