n阶的法里数列是0和1之间最简分数的数列,由小至大排列,每个分数的分母不大于n。
Stern-Brocot树(SB Tree)可以生成这个序列
Farey sequences UVA - 10408
求n阶Farey sequences的第k项,找到下一项的递推式,也就是基本不等式
#include <stdio.h> int main(){ int n,k; while(~scanf("%d%d",&n,&k)){ int a0=0,a1=1,b0=1,b1=n,a2,b2; for(int i=1;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 ",a1,b1); } return 0; }
X - Farey Sequence
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
Output
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+5; typedef __int64 ll; int phi[N],prime[N]; ll sum[N]; bool vis[N]; void Euler() { phi[1]=1; int cnt=0; for(int i=2;i<=1e6;i++) { if(!vis[i]){prime[++cnt]=i;phi[i]=i-1;} for(int j=1;j<=cnt&&prime[j]*i<=1e6;j++) { vis[prime[j]*i]=1; if(i%prime[j])phi[prime[j]*i]=phi[i]*(prime[j]-1); else {phi[prime[j]*i]=phi[i]*prime[j];break;} } } } int main() { Euler();sum[2]=1; for(int i=3;i<=1e6;i++) sum[i]+=sum[i-1]+phi[i]; int n; while(~scanf("%d",&n)){ if(!n)break; printf("%I64d ",sum[n]); } return 0; }
2866: Farey Sequence Again
总提交: 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.
样例输入
样例输出
题目来源
这个题是真的难啊,想了想查了查相关资料都做不了,最后竟然是利用这个级数增长很快,能互质的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 (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 s = 12, t = 4 and s = 6, t = 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 (t = 0) and in the last case GtDzx would get the whole cake (s = 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 N (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
这个题也是这个内容,但是也没那么难啊,存一下所有的查询就好了