UVa 10820 Send a Table(欧拉函数)
题意:
求n以内的 互素对的个数对于数对(x,y)(x<y)是互素对的话 则(y,x)也是互素对
思路:
http://www.csie.ntnu.edu.tw/~u91029/Prime.html
欧拉函数:
n = p1^a1 × p2^a2 × … × pk^ak where p1 … pk are primes
φ(n) = n × (1 - 1/p1) × (1 - 1/p2) × … × (1 - 1/pk)
可以化简求法为:n ÷ p1 × (p1-1) ÷ p2 × (p2-1) ÷ … ÷ pk × (pk-1)
代码中用了筛选素数的方法来实践上式,可谓精妙。
//
// http://www.csie.ntnu.edu.tw/~u91029/Prime.html
//
#include <cstdio>
#include <cstdlib>
#include <cstring>
const int MAXN = 50010;
int phi[MAXN];
void phi_table()
{
memset(phi, 0, sizeof(phi));
phi[1] = 1;
for (int i = 2; i < MAXN; ++i)
if (!phi[i])
for (int j = i; j < MAXN; j += i)
{
if (!phi[j])
phi[j] = j;
phi[j] = phi[j] / i * (i - 1);
}
}
int main()
{
int n;
phi_table();
while (scanf("%d", &n) && n)
{
int ans = phi[1];
for (int i = 2; i <= n; ++i)
ans += phi[i] << 1;
printf("%d\n", ans);
}
return 0;
}
-------------------------------------------------------
kedebug
Department of Computer Science and Engineering,
Shanghai Jiao Tong University
E-mail: kedebug0@gmail.com
GitHub: http://github.com/kedebug
-------------------------------------------------------