hdoj Stern-Brocot Tree 4556 (欧拉函数打表)

来源:互联网 发布:图书馆借阅源码 php 编辑:程序博客网 时间:2024/04/28 12:43

Stern-Brocot Tree

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 539    Accepted Submission(s): 286


Problem Description
  

  
  上图是一棵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的个数。

Input
  输入包含多组测试用例,每组输入数据是一个正整数n(n<=1000000)。

Output
  对于每组的测试数据n,请输出第n行的数列F的个数。

Sample Input
1246

Sample Output
351325
 
#include<stdio.h>#include<string.h>#include<algorithm>#define N 1000010#define ll long longusing namespace std;ll a[N];ll b[N];ll eular(){int i,j;memset(a,0,sizeof(a));a[1]=1;for(i=2;i<N;i++){if(!a[i]){for(j=i;j<N;j+=i){if(!a[j])a[j]=j;a[j]=a[j]/i*(i-1);}}}ll ans=0;for(i=1;i<N;i++){ans+=a[i];b[i]=2*ans+1;}}int main(){int n;eular();while(scanf("%d",&n)!=EOF){printf("%I64d\n",b[n]);}return 0;}

0 0