Farey sequences

时间:2024-01-02 15:41:32

n阶的法里数列是0和1之间最简分数数列,由小至大排列,每个分数的分母不大于n

Farey sequences

Stern-Brocot树(SB Tree)可以生成这个序列

{0/1,1/1}
{0/1,1/2,1/1}
{0/1,1/3,1/2,2/3,1/1}
{0/1,1/4,1/3,1/2,2/3,3/4,1/1}
{0/1,1/5,1/4,1/3,2/5,1/2,3/5,2/3,3/4,4/5,1/1}
{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}
{0/1,1/7,1/6,1/5,1/4,2/7,1/3,2/5,3/7,1/2,4/7,3/5,2/3,5/7,3/4,4/5,5/6,6/7,1/1}
{0/1,1/8,1/7,1/6,1/5,1/4,2/7,1/3,3/8,2/5,3/7,1/2,4/7,3/5,5/8,2/3,5/7,3/4,4/5,5/6,6/7,7/8,1/1}
{0/1,1/9,1/8,1/7,1/6,1/5,2/9,1/4,2/7,1/3,3/8,2/5,3/7,4/9,1/2,5/9,4/7,3/5,5/8,2/3,5/7,3/4,7/9,4/5,5/6,6/7,7/8,8/9,1/1}
{0/1,1/10,1/9,1/8,1/7,1/6,1/5,2/9,1/4,2/7,3/10,1/3,3/8,2/5,3/7,4/9,1/2,5/9,4/7,3/5,5/8,2/3,7/10,5/7,3/4,7/9,4/5,5/6,6/7,7/8,8/9,9/10,1/1}

Farey sequences UVA - 10408

Farey sequences

求n阶Farey sequences的第k项,找到下一项的递推式,也就是基本不等式

#include <stdio.h>
int main(){
int n,k;
while(~scanf("%d%d",&n,&k)){
int a0=,a1=,b0=,b1=n,a2,b2;
for(int i=;i<k;i++){
int c=(n+b0)/b1;
a2=c*a1-a0;
b2=c*b1-b0;
a0=a1,a1=a2;
b0=b1,b1=b2;
}
printf("%d/%d\n",a1,b1);
}
return ;
}

X - Farey Sequence

The Farey Sequence Fn for any integer n with n >= 2 is the set of irreducible rational numbers a/b with 0 < a < b <= n and gcd(a,b) = 1 arranged in increasing order. The first few are 
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}

You task is to calculate the number of terms in the Farey sequence Fn.

Input

There are several test cases. Each test case has only one line, which contains a positive integer n (2 <= n <= 10 6). There are no blank lines between cases. A line with a single 0 terminates the input.

Output

For each test case, you should output one line, which contains N(n) ---- the number of terms in the Farey sequence Fn. 

Sample Input

2
3
4
5
0

Sample Output

1
3
5
9

这个函数的个数有个近似值,但是这个要求准确的个数,这个个数也没什么规律

Fn是分母是小于n的,而且其他和他互质,欧拉函数是积性函数,所以欧拉函数求下前缀和就行了

E(x)表示比x小的且与x互质的正整数的个数,也就是欧拉函数

#include <stdio.h>
const int N=1e6+;
typedef __int64 ll;
int phi[N],prime[N];
ll sum[N];
bool vis[N];
void Euler()
{
phi[]=;
int cnt=;
for(int i=;i<=1e6;i++)
{
if(!vis[i]){prime[++cnt]=i;phi[i]=i-;}
for(int j=;j<=cnt&&prime[j]*i<=1e6;j++)
{
vis[prime[j]*i]=;
if(i%prime[j])phi[prime[j]*i]=phi[i]*(prime[j]-);
else {phi[prime[j]*i]=phi[i]*prime[j];break;}
}
}
}
int main()
{
Euler();sum[]=;
for(int i=;i<=1e6;i++)
sum[i]+=sum[i-]+phi[i];
int n;
while(~scanf("%d",&n)){
if(!n)break;
printf("%I64d\n",sum[n]);
}
return ;
}

2866: Farey Sequence Again Farey sequences

时间限制(普通/Java):1000MS/3000MS     内存限制:65536KByte
总提交: 14            测试通过:7

描述

The Farey sequence Fn for any positive integer n is the set of irreducible rational numbers a/b with 0<a<b<=n and (a, b) = 1 arranged in increasing order. Here (a, b) mean the greatest common divisor of a and b. For example:
            F2 = {1/2}
            F3 = {1/3, 1/2, 2/3}
      Given two positive integers N and K, with K less than N, you need to find out the K-th smallest element of the Farey sequence FN.

输入

The first line of input is the number of test case T, 1<=T<=1000. Then each test case contains two positive integers N and K. 1<=K<N<=10^9.

输出

For each test case output the Kth smallest element of the Farey sequence FN in a single line.

样例输入

样例输出

题目来源

Asia Chengdu Pre 2008

这个题是真的难啊,想了想查了查相关资料都做不了,最后竟然是利用这个级数增长很快,能互质的1,2,3用完就到1e9了,根本到不了n,贼鸡儿难想,%大佬,TOJ也有高人啊

Updog prepared to enjoy his delicious supper. At the very time he was ready to eat, a serious accident occurred—GtDzx appeared!! GtDzx declared his hadn't eaten anything for 3 days (obviously he was lying) and required Updog to share the cake with him. Further more, he threatened Updog that if Updog refused him, he would delete Updog's account in POJ! Thus Updog had no choice.

Updog intended to cut the cake into (s ≥ 1) pieces evenly, and then gave t(0≤ t ≤ s) pieces to GtDzx. Apparently GtDzx might get different amount of cake for different s and t. Note that = 12, = 4 and = 6, = 2 will be regarded as the same case since GtDzx will get equal amount in the two cases. Updog wouldn't separate the cake into more than N pieces.

After sorted all available cases according to the amount of cake for GtDzx, in the first case no cake to gave to GtDzx (= 0) and in the last case GtDzx would get the whole cake (= t). Updog wondered that how much cake GtDzx would get in the k-th case.

Input

The first line of the input file contains two integers (1 ≤ N ≤ 5000) and C(0 ≤ C≤ 3000). The following C lines each contains a positive integer describe C query respectively. The i-th query ki is to ask GtDzx's share of whole cake in the ki-th case .

Output

Answer each query in a separated line, according to the order in the input.

Sample Input

5 4
1
7
11
12

Sample Output

0/1
3/5
1/1
No Solution

这个题也是这个内容,但是也没那么难啊,存一下所有的查询就好了