hdu4556(欧拉函数)

来源:互联网 发布:淘宝要扫码支付怎么弄 编辑:程序博客网 时间:2024/05/29 07:17


把树从中间隔开,只看前一半,然后第n行的分子分母大于n的数去掉,明显这里的个数是法里数列,也就是0到1的最简真分数的个数,而当法里数列a[n]=k的时候,a[n+1]=a[n]+phi[n+1]=k+phi[n+1],其中phi[n+1]是n+1的欧拉函数值,这也很明显,n+1欧拉函数值是1-----n+1与n+1互质的数的个数,则所有1到n+1与n+1互质的数都可以和n+1组成最简真分数,并且都属于n+1法里数列的元素。

因此我们只需要用筛法求出数据范围内的欧拉函数值就可以了


#include <cstdio>#include <set>#include <string>#include <cstring>#include <algorithm>#define LL __int64#define MM 1000010using namespace std;LL phi[MM],a[MM];void init(){int i,j;for(i=1;i<MM;i++)phi[i]=i;for(i=2;i<MM;i++){if(phi[i]==i){for(j=i;j<MM;j+=i)phi[j]=phi[j]/i*(i-1);}}a[1]=2;a[2]=3;for(i=3;i<MM;i++)a[i]=a[i-1]+phi[i];}int main(){    int n;init();    //freopen("D://p.txt","r",stdin);while(~scanf("%d",&n))printf("%I64d\n",a[n]*2-1);    return 0;}


0 0
原创粉丝点击