上图是一棵Stern-Brocot树,其生成规则如下:
从第1行到第n行,每行相邻两数a/b和c/d,产生中间数(a+c)/(b+d),置于下一行中。将一行的分数(包括0/1,1/0),进行约分简化,则每一行(包括0/1,1/0,1/1),不会出现两个相同的分数。若分子或者分母大于n,则去掉该分数,将剩下的分数,从小到大排序,得到数列F。
现在请您编程计算第n行的数列F的个数。
1 2 4 6Sample Output
3 5 13 25
// 欧拉函数、找规律
#include <cstdio>
#define MAX 1000010
typedef long long LL;
LL phi[MAX];
LL a[MAX];
void euler() {
for( LL i = 1; i < MAX; i++ ) phi[i] = i;
for( LL i = 2; i < MAX; i++ ) {
if( phi[i] == i ) { //如果i是质数
for( LL j = i; j < MAX; j += i ) {
phi[j] = phi[j] / i * ( i - 1 ); //提一个1/i,先进行除法是为了防止中间数据的溢出
}
}
}
a[1]=2;
a[2]=3;
for( LL i =3; i < MAX; i++ ) {
a[i] = a[i - 1] + phi[i];
}
}
int main() {
euler();
LL n;
while( scanf( "%lld", &n ) != EOF ) {
printf( "%lld\n", a[n] * 2 - 1 );
}
return 0;
}