Problem 71:Ordered fractions
题目链接:http://static.projecteuler.net/problem=71
题目大意:将所有形如$frac{n}{d}(d leqslant 1,000,000)$的最简真分数按大小升序排列,求此时$frac{3}{7}$直接左邻的分数的分子。
$n$阶法里数列是$0$和$1$之间最简分数的数列,由小至大排列,每个分数的分母不大于$n$。
设$F_n$为$n$阶法里数列,则有如下性质:
- $|F_n|=|F_{n-1}|+varphi (n)$.
因为$F_n$仅比$F_{n-1}$多了$E={frac{p}{n}:(p,n)=1}$,其中$|E|=varphi (n)$。由$|F_1|=2,$可推出$|F_n|=1+sum_{i=1}^n varphi(n)$.
- 若$frac{a}{b}$和$frac{c}{d}$是某$k$阶法里数列的相邻项,且$frac{a}{b} < frac{c}{d}$,则它们之差为$frac{1}{bd}$,也就是说$bc-ad=1$。反之同样成立:若$frac{a}{b}$,$frac{c}{d}$均为真分数,且$frac{a}{b} < frac{c}{d}$,$bc-ad=1$,则有$frac{a}{b}$和$frac{c}{d}$在$k$阶法里数列中是邻项,$k=max{b,d}$.
- 若$frac{a}{b}$和$frac{c}{d}$是某$k$阶法里数列的相邻项,随着$k$增大,$frac{a}{b}$和$frac{c}{d}$间出现的第一项为$frac{a+c}{b+d}$.
这里用到了法里数列的第三条性质。
代码如下:
1 #include <iostream> 2 using namespace std; 3 int main(void){ 4 int a=2,b=5; 5 while(b+7<=1000000){ 6 a+=3; 7 b+=7; 8 } 9 cout<<a; 10 }