zoukankan      html  css  js  c++  java
  • 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
    ", a[n]);
    32 
    33     return 0;
    34 }
    本文为博主原创文章,未经博主允许不得转载。
  • 相关阅读:
    团队冲刺第四天
    团队冲刺第三天
    团队冲刺第二天
    冲刺(六)
    冲刺(五)
    冲刺(四)
    冲刺(三)
    冲刺(二)
    冲刺(一 )
    第一阶段SCRUM
  • 原文地址:https://www.cnblogs.com/alihenaixiao/p/4451438.html
Copyright © 2011-2022 走看看