Farey Sequence法里序列

来源:互联网 发布:淘宝怎么选爆款 编辑:程序博客网 时间:2024/04/28 09:58

Description

Farey数列Fn对于每个n( n>=2),如果0<a<b<=n ab互质a/b为不可约有理数,那么就在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
}

 Input

每行输出一个n (2 <= n <= 106).输出0时停止输入。

Output

计算出fn集合中有多少个数.

Sample Input  Sample Output

2   1

3   3

4   5

5   9

0

不能直接用欧拉函数


#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;

int phi[1000000+5];
void solve()

{

    memset(phi,0,sizeof(phi));

    for (int i=2; i<=1000000; i++) //筛选求phi

    {

        if (!phi[i])//当phi[i]未访问,就是phi[i]=0的时候.

        {

            for (int j=i; j<=1000000; j+=i)

            {

                if(!phi[j])//当phi[j]未访问

                    phi[j]=j;//将phi[j]设为访问且值为j,方便接下来计算。

                phi[j]=phi[j]-phi[j]/i;//算出phi[j]的个数(欧拉公式)。

            }
        }
    }
}
 int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        int sum=0;
    for (int i=2; i<=n; i++)
          sum+=phi[i];//由题可看出Fn等于小于n 的欧拉数的和
          printf("%d\n",sum);
    }
    return 0;
}

0 0
原创粉丝点击