poj 2478 Farey Sequence

题目链接:

  http://poj.org/problem?id=2478

题目大意:

  在一个集合f(n)中,包涵一些分数a/b,这些分数满足:

  1:不可约分。

  2:0 < a < b <= n and gcd(a,b) = 1。已知n,问f(n)里面有多少个元素?

解题思路:

  如果把a,b分别当成横纵坐标,可以画出一个n*n的矩阵,因为0 < a < b <= n ,所以只有矩阵主对角线上方的点组成的分数有可能满足要求(不包含主对角线),因此可以推得f(n) = f(n-1)+[1,n]区间内与n的最大公约数为1的数的个数。

代码:

 1 #include <cmath>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <iostream>
 5 #include <algorithm>
 6 using namespace std;
 7 
 8 #define maxn 1000010
 9 long long b[maxn], a[maxn];//因为数据范围太大,int会超限
10 void prime ()
11 {
12     int i, j, k = 0;
13     for (i=0; i<maxn; i++)
14         a[i] = i, b[i] = 0;
15     for (i=2; i<maxn; i++)
16         if (b[i] == 0)
17         {
18             for (j=i; j<maxn; j+=i)
19                 b[j] = 1, a[j] = a[j] / i * (i-1);//利用欧拉函数求少于或等于n的数中与n互质的数的数目
20         }
21 }
22 
23 
24 int main ()
25 {
26     int n, i;
27     prime();
28     for (i=3; i<maxn; i++)
29         a[i] += a[i-1];
30     while (scanf ("%d", &n), n)
31         printf ("%lld\n", a[n]);
32 
33     return 0;
34 }

 

你可能感兴趣的:(sequence)