1. 程式人生 > >uva10820(數論 +尤拉函式)

uva10820(數論 +尤拉函式)

題意:

給出n,算出小於等於n的所有數中,有幾對互質;

思路:

尤拉函式:尤拉函式的原理是,把n所有的因子的倍數全部去掉;

例如12的因子有2,3,4,6;就把12以下2,3,4,6的倍數全部減掉,剩下的就是和12互質的數.

尤拉函式是算小於n的數中,有幾個數和n互質.

然後把1到n的所有尤拉函式的值累加起來就行了.

#include<cstdio>
#include<cstring>
#include<cmath>

const int N = 50005;
int prime[N];
int n;
void solve() {
	prime[1] = 1;
	for(int i = 2 ; i <= N ;i++) {
		if(!prime[i]) {
			for(int j = i ; j <= N ; j += i) {
				if(!prime[j])
					prime[j] = j;
				prime[j] = prime[j] / i * (i - 1);
			}
		}
	}
	for(int i = 2 ; i <= N ;i++) {
		prime[i] += prime[i - 1];
	}
}
int main () {
	solve();
	while(scanf("%d",&n) && n) {
		printf("%d\n",prime[n] * 2 - 1);
	}
}