HDU-4556-Stern-Brocot Tree

来源:互联网 发布:网络销售期货白银好做 编辑:程序博客网 时间:2024/04/26 02:46

网上有关于这个树的资料,其实它的一半就是法里数列

相关资料:http://zh.wikipedia.org/wiki/%E6%B3%95%E9%87%8C%E6%95%B8%E5%88%97

上面有递推公式,仅仅是需要用较快的方法求出欧拉函数。

代码:

#include<cstdio>#include<cstring>#include<iostream>using namespace std;const int maxn=1000011;int n;long long ans[maxn],phi[maxn];void Phi(int n){    phi[1]=1;    for(int i=2;i<=n;i++)if(!phi[i])    for(int j=i;j<=n;j+=i)    {if(!phi[j])    phi[j]=j;phi[j]=phi[j]/i*(i-1);    }}int main(){    Phi(maxn-1);    ans[1]=2;    ans[2]=3;    for(int i=3;i<maxn;i++)ans[i]=ans[i-1]+phi[i];    while(scanf("%d",&n)!=EOF)    {long long s=(ans[n]-2)*2+3;printf("%I64d\n",s);    }    return 0;}