0
点赞
收藏
分享

微信扫一扫

法雷级数(数列)


关于法雷级数:


<-----------------------------------以下内容摘自百度--------------------------------->


法雷级数



真分数(分子和分母互质)按增加顺序排列;第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



…… ………………………………




<----------------------------------------------------------------------------------------->



法雷级数和欧拉函数是有密切联系的。


法雷数列(一)


​​http://acm.nyist.net/JudgeOnline/problem.php?pid=334​​


出n让你求其n级法雷数列。如F5为:0/1,1/5, 1/4, 1/3, 2/5, 1/2, 3/5, 2/3, 3/4, 4/5,1/1.



#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int gcd(int a,int b){
return b==0?a:gcd(b,a%b);
}
struct node{
int x,y;
}p[10005];
int cmp(node a,node b){
return a.x*b.y<a.y*b.x;
}
int main()
{
int n;
while(cin>>n){
int cnt=0;
for(int i=2;i<=n;i++){
for(int j=1;j<i;j++){
if(gcd(i,j)==1){
p[cnt].x=j;
p[cnt++].y=i;
}
}
}
sort(p,p+cnt,cmp);
printf("0/1");
for(int i=0;i<cnt;i++){
printf(",%d/%d",p[i].x,p[i].y);
}
printf(",1/1\n");
}
return 0;
}


Farey Sequence


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


问N级法雷级数有多少项?如F3 = {1/3, 1/2, 2/3}  所以N=3时,项的个数是3.


#include <iostream>
#include <cstdio>
using namespace std;
const int N=1e6+10;
typedef long long LL;
int phi[N];
int main()
{
for(int i=1;i<N;i++) phi[i]=i;
for(int i=2;i<N;i++){
if(phi[i]==i){
for(int j=i;j<N;j+=i){
phi[j]=phi[j]/i*(i-1);
}
}
}
int n;
while(cin>>n&&n){
LL ans=0;
for(int i=2;i<=n;i++){
ans=ans+phi[i];
}
printf("%lld\n",ans);
}
return 0;
}


法雷数列(二)


​​http://acm.nyist.net/JudgeOnline/problem.php?pid=335&rec=rec​​



大意:和上题及其相似,不过有点卡时间。打了表还是TLE,后来不用cin,改成标准输入,过了。



#include <stdio.h>
#define LL long long
const int N=15e5+10;
int phi[N];
LL sum[N];
void init(){
for(int i=1;i<N;i++) phi[i]=i;
for(int i=2;i<N;i++){
if(phi[i]==i) {
for(int j=i;j<N;j+=i) phi[j]=phi[j]-phi[j]/i;
}
}
sum[2]=phi[2];
for(int i=3;i<N;i++){
sum[i]=sum[i-1]+phi[i];
}
}
int main()
{
init();
int n;
while(~scanf("%d",&n)){
printf("%lld\n",sum[n]+2);
}
return 0;
}


POJ 3090 Visible Lattice Points


​​http://poj.org/problem?id=3090​​


问如图



法雷级数(数列)_ios



给定范围后,求出能看的点的个数



分析:法雷级数的应用

#include <iostream>
#include <cstdio>
using namespace std;
const int N=1e3+10;
typedef long long LL;
int phi[N];
LL sum[N];
void init(){
for(int i=1;i<N;i++) phi[i]=i;
for(int i=2;i<N;i++){
if(phi[i]==i){
for(int j=i;j<N;j+=i){
phi[j]=phi[j]-phi[j]/i;
}
}
}
sum[2]=phi[2];
for(int i=3;i<N;i++){
sum[i]=sum[i-1]+phi[i];
}
}
int main()
{
init();
int t,n,ca=1;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
printf("%d %d %lld\n",ca++,n,sum[n]*2+3);
}
return 0;
}





举报

相关推荐

0 条评论