传送门:http://poj.org/problem?id=2478
Description
The Farey Sequence Fn for any integer n with n >= 2 is the set of irreducible rational numbers a/b with 0 < a < b <= n and gcd(a,b) = 1 arranged in increasing order. The first few are
F2 = {1/2}
F3 = {1/3, 1/2, 2/3}
F4 = {1/4, 1/3, 1/2, 2/3, 3/4}
F5 = {1/5, 1/4, 1/3, 2/5, 1/2, 3/5, 2/3, 3/4, 4/5}
You task is to calculate the number of terms in the Farey sequence Fn.
Input
There are several test cases. Each test case has only one line, which contains a positive integer n (2 <= n <= 106). There are no blank lines between cases. A line with a single 0 terminates the input.
Output
For each test case, you should output one line, which contains N(n) ---- the number of terms in the Farey sequence Fn.
Sample Input
2
3
4
5
0
Sample Output
1
3
5
9
题意
给你一个数m,问你<m,且与m互质的数的个数
思路
欧拉函数,n比较大,快速打表……
#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<cctype>
#include<vector>
#include<stack>
#include<queue>
#include<ctime>
#define ll long long
#define ld long double
#define ull unsigned long long
using namespace std;
const int maxn = 1000010;
const int inf = 0x3f3f3f3f3f;
const ll lnf = 0x3f3f3f3f3f3f3f;
const ll mod = 1000000007;
int pri[maxn],tot;
int phi[maxn];
bool v[maxn];
void euler()
{
memset(v,true,sizeof(v));
v[1] = false;
tot = 0;
for(int i=2;i<maxn;i++){
if(v[i]){
pri[++tot] = i;
phi[i] = i-1; //欧拉函数性质一,i是质数
}
for(int j=1;j<=tot&&i*pri[j]<maxn;j++){
v[i*pri[j]] = false;
if(i%pri[j]==0){
phi[i*pri[j]] = phi[i] * pri[j]; //欧拉函数性质二,pri[j]|i
break;
}
phi[i*pri[j]] = phi[i] * phi[pri[j]]; //欧拉函数性质二,gcd(i,pri[j])=1
}
}
}
int main(void)
{
int n;
ll ans = 0;
euler();
while(scanf("%d",&n),n){
ans = 0;
for(int i=2;i<=n;i++){
ans += (ll)phi[i];
}
printf("%lld\n",ans);
}
return 0;
}