poj 3090(法雷级数。。。)

不知道法雷级数的可以看一下百度百科里的介绍。。。很详细。。。
R.亨斯贝尔格著李忠翻译的《数学中的智巧》一书,介绍了法雷级数。这里每一行从0/1开始,以1/1结尾,其它数自左至右将所有的真分数按增加顺序排列;第n行是由所有分母小于或等于n的真分数组成,我们称为n阶法雷级数。如下表:
  F1: 0/1 1/1
  F2: 0/1 1/2 1/1
  F3: 0/1 1/3 1/2 2/3 1/1
  F4: 0/1 1/4 1/3 1/2 2/3 3/4 1/1
  F5: 0/1 1/5 1/4 1/3 2/5 1/2 3/5 2/3 3/4 4/5 1/1
  F6:0/1 1/6 1/5 1/4 1/3 2/5 1/2 3/5 2/3 3/4 4/5 5/6 1/1
  …… ………………………………
  这里我们想问的是第n行Fn的真分数的个数有多少个呢?
  我们设Fn的个数为ψ(n), ψ(n)比 ψ(n-1)增加的个数是分母是n,分子比n小且与n互质的数的个数,这正是欧拉函数φ(n)。即
  ψ(n)=ψ(n-1)+ φ(n)
  ψ(1)=1+φ(1)
  ψ(2)=ψ(1)+φ(2)
  ψ(3)=ψ(2)+φ(3)
  ………………
  ψ(n)= ψ(n-1)+ φ(n)
  所以 ψ(n)=1+φ(1)+φ(2)+φ(3)+……+φ(n)很容易证明,当n≥3时,欧拉函数φ(n)是个偶数。由此我们得到除ψ(1)=2是偶数外,法雷级数其它各级的个数都是奇数,并且许多是素数。ψ(1)=2,ψ(2)=3,ψ(3)=5,ψ(4)=7,ψ(5)=11,ψ(6)=13,ψ(7)=19,ψ(8)=23,ψ(9)=29,……。

#include <iostream>
#include <cstdio>
#include<cstring>
using namespace std;
const int maxlen=1010;
int eul[maxlen];
inline void get_eular() {
    memset(eul,0,sizeof(eul));
    for(int i=2;i<maxlen;i++)
        if(!eul[i])
            for(int j=i;j<maxlen;j+=i){
                if(!eul[j]) eul[j]=j;
                eul[j]=eul[j]/i*(i-1);
            }
    eul[1]=0;eul[2]=1;
    for(int i=3;i<maxlen;i++){
        eul[i]+=eul[i-1];
    }
}
int main(int argc, char** argv) {
    int m,n;
    get_eular();
    scanf("%d",&m);
    for(int i=1;i<=m;i++){
        scanf("%d",&n);
        printf("%d %d %d\n",i,n,((eul[n]+1)<<1)+1);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值