http://acm.hdu.edu.cn/showproblem.php?pid=4556
只观察树的左半边会发现全是真分数,每一层就是分母不超过1-n的所有真分数的表示。
这种树是用来构造法里数列的;
法里数列表示的是分母不超过n的所有真分数的数量。
也可以理解成是欧拉函数的前缀和。
我们可以考虑用类似素数筛的方式来快速求得欧拉函数的值。
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+10;
#define ll long long int
ll ans[maxn],zhi[maxn];
bool vis[maxn];
int main()
{
//memset(vis,0,sizeof vis);
for(int i=1;i<maxn;i++){
zhi[i]=i;
}
for(int i=2;i<maxn;i++){
if(zhi[i]==i){
for(int j=i;j<maxn;j+=i)
zhi[j]-=zhi[j]/i;
}
}
ans[1]=2;
ans[2]=3;
for(int i=3;i<maxn;i++){
ans[i]=ans[i-1]+zhi[i];
}
int n;
while(~scanf("%d",&n)){
printf("%lld\n",ans[n]*2-1);
}
return 0;
}