Farey Sequence
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 12198 | Accepted: 4726 |
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.
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
题目链接 :http://poj.org/problem?id=2478
题目大意 :输入一个n,求满足条件的a/b分数的个数,条件为 0 < a < b <= n , n >= 2 并且a和b的最大公约数为1
题目分析 :欧拉函数裸题,公式见之前欧拉函数那篇博文,这里只需要求出2 - n对应的欧拉函数的值,把它们相加就是答案
#include <cstdio>
#include <cstring>
int const MAX = 1e6 + 2;
int euler[MAX];
int prime[MAX];
void get_prime() //素数筛
{
memset(prime,1,sizeof(prime));
prime[1] = 0;
for(int i = 2; i * i <= MAX; i++)
if(prime[i])
for(int j = i * i; j <= MAX; j += i)
prime[j] = 0;
}
void cal() //计算欧拉函数值
{
for(int i = 2; i <= MAX; i++)
euler[i] = i;
for(int i = 2; i <= MAX; i++)
if(prime[i])
for(int j = i; j <= MAX; j += i)
euler[j] = euler[j] / i * (i - 1);
}
int main()
{
int n;
long long ans;
get_prime();
cal();
while (scanf("%d",&n) != EOF && n)
{
ans = 0;
for (int i = 2; i <= n; i++)
ans += euler[i];
printf("%lld\n",ans);
}
}