不知道法雷级数的可以看一下百度百科里的介绍。。。很详细。。。
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;
}