题目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的个数。
/*
哥的智商是得有多拙计
哥是第一个发表这题解的。。。
*/
#include<cstdio>
#define inf 1000000
int phi[inf];
void getphi()
{
int i,j;
phi[1]=1;
for(i=2;i<=inf;i++)
phi[i]=i;
for(i=2;i<=inf;i++)
if(phi[i]==i)
for(j=i;j<=inf;j+=i)
phi[j]=phi[j]/i*(i-1);
}
int main()
{
getphi();
int a,b,i,sum,n;
while(scanf("%d",&n)!=EOF)
{
__int64 sum=0;
for(i=1;i<=n;i++)
sum+=phi[i];
printf("%I64d\n",sum*2+1);
//printf("%d\n",phi[3]);
}
return 0;
}