http://poj.org/problem?id=2478

题意:给定一个数x,求<=x的数的欧拉函数值的和。(x<=10^6)

题解:数据范围比较大,像poj1248一样的做法是不可行的了。

首先我们要了解欧拉函数的几个性质和推论:(今天跟好基友Konjak魔芋讨论了好久。。)

推论(一): phi(p^k)=(p-1)*p^(k-1)

证明:

令n=p^k,小于等于n的正整数数中,所有p的倍数共有p^k /p = p^(k-1)个。

1~n出去p的倍数,所以phi(n)= n -  p^(k-1)  = p^k - p^(k-1) =  (p-1)*p^(k-1).得证。

引用自scy的讲解。

性质(一):若ab互质,则phi(a*b)=phi(a)*phi(b)。即:欧拉函数是积性函数.

证明:

对任意数n都可以唯一分解成n=p1^a1*p2^a2*p3^a3*...*pn^an(pi为素数).
            则E(n)=n*(1-1/p1)*(1-1/p2)*...*(1-1/pn)

=(p1^a1*p2^a2*p3^a3*...*pn^an)*[(p1-1)*(p2-1)*(p3-1)*...*(pn-1)]/(p1*p2*p3*...*pn)

=(p1-1)*p1^(a1-1)*(p2-1)*p2^(a2-1)*...*(pn-1)*pn^(an-1)     ---(1)
            =E(p1^a1)*E(p2^a2)*E(p3^a3)*...*E(pn^an)

所以当ab互质的时候E(a*b)=E(a)*E(b)

注明:E()即是phi()。

推论(二):当b是质数,a%b==0,phi(a*b)=phi(a)*b

这个的证明可以代入到上面性质一的证明之中:

b=gcd(a,b),指数为q。

在(1)中,即E(a*b)中有(b-1)*b^(q-1)

若E(a*b)拆分为E(a)*E(b),则多乘了一次(b-1)*b^(-1),那么我们为了方程两边相等,得到了:

E(a*b)=E(a)*E(b)*b/(b-1)

因为b是素数,phi(b)=b-1

所以E(a*b)=E(a)*b。

另一种证明:phi(a*b)=phi(a)*b,a%b==0

a=k*b^n,gcd(k,b)==1

phi(a*b)=phi(k*b^(n+1))=phi(k)*(b-1)*b^n

phi(k)=phi(k*b^n)/phi(b)=phi(k*b^n)/((b-1)*(b^(n-1)))

约分,则phi(a*b)=phi(k*b^n)*b=phi(a)*b

推论(三): 当n为奇数时,E(2n)=E(n)

2是一个质数,n为奇数则一定与2互质,E(2n)=E(2)*E(n),其中E(2)=1。

推论(四): 当n是一个大于2的正整数时,E(n)是偶数

   若n是素数,则E(n)=n-1,又因为素数中偶数只有2,则n-1一定是偶数

若n是合数,则可以分解质因数,E(n)=E(p1)*E(p2)*…… 根据上一步的结论,E(n)一定是偶数。

有了上面的基础,我们就可以轻易地推出O(n)的方法解决这个问题了,也就是在欧拉筛中顺便更新欧拉函数值。

具体看代码吧,非常明白的了。

今天还做了几题欧拉函数的题,真是觉得自己不是完全懂欧拉函数的。现在把这道题学到的东西归纳一下,才发现一道代码这么短的题有这么多的知识。。

 #include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
using namespace std; typedef long long LL;
const int Max=(int)1e6;
const int N=Max+;
LL pl;
LL p[N],phi[N],sum[N];
bool vis[N]; void eular()
{
memset(vis,,sizeof(vis));
pl=;
for(int i=;i<=Max;i++)
{
if(!vis[i]) p[++pl]=i,phi[i]=i-;
for(int j=;j<=pl;j++)
{
if(i*p[j]>Max) break;
vis[i*p[j]]=;
if((i%p[j])==)
{
phi[i*p[j]]=phi[i]*p[j];
break;
}
else phi[i*p[j]]=phi[i]*(p[j]-);
}
}
} int main()
{
// freopen("a.in","r",stdin);
// freopen("a.out","w",stdout);
eular();
sum[]=;
for(LL i=;i<=Max;i++) sum[i]=sum[i-]+phi[i];
while()
{
LL x;
scanf("%I64d",&x);
if(!x) return ;
printf("%I64d\n",sum[x]);
}
return ;
}

【poj2478-Farey Sequence】递推求欧拉函数-欧拉函数的几个性质和推论的更多相关文章

  1. POJ2478 Farey Sequence —— 欧拉函数

    题目链接:https://vjudge.net/problem/POJ-2478 Farey Sequence Time Limit: 1000MS   Memory Limit: 65536K To ...

  2. NYOJ-301递推求值

    递推求值 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述 给你一个递推公式: f(x)=a*f(x-2)+b*f(x-1)+c 并给你f(1),f(2)的值,请求出f ...

  3. HDU 5860 Death Sequence(递推)

    HDU 5860 Death Sequence(递推) 题目链接http://acm.split.hdu.edu.cn/showproblem.php?pid=5860 Description You ...

  4. 算法笔记_091:蓝桥杯练习 递推求值(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 已知递推公式: F(n, 1)=F(n-1, 2) + 2F(n-3, 1) + 5, F(n, 2)=F(n-1, 1) + 3F(n- ...

  5. NYOJ——301递推求值(矩阵快速幂)

    递推求值 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 给你一个递推公式: f(x)=a*f(x-2)+b*f(x-1)+c 并给你f(1),f(2)的值,请求出f(n)的 ...

  6. poj 3744 Scout YYF I(递推求期望)

    poj 3744 Scout YYF I(递推求期望) 题链 题意:给出n个坑,一个人可能以p的概率一步一步地走,或者以1-p的概率跳过前面一步,问这个人安全通过的概率 解法: 递推式: 对于每个坑, ...

  7. Java实现 蓝桥杯 算法提高 递推求值

    算法提高 递推求值 时间限制:1.0s 内存限制:256.0MB 问题描述 已知递推公式: F(n, 1)=F(n-1, 2) + 2F(n-3, 1) + 5, F(n, 2)=F(n-1, 1) ...

  8. poj2478 Farey Sequence (欧拉函数)

    Farey Sequence 题意:给定一个数n,求在[1,n]这个范围内两两互质的数的个数.(转化为给定一个数n,比n小且与n互质的数的个数) 知识点: 欧拉函数: 普通求法: int Euler( ...

  9. poj2478——Farey Sequence(欧拉函数)

    Farey Sequence Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 18507   Accepted: 7429 D ...

随机推荐

  1. 代码编译方式 ant +ivy

    Apache Ant,是一个将软件编译.测试.部署等步骤联系在一起加以自动化的一个工具,大多用于Java环境中的软件开发.由Apache软件基金会所提供. 没用过ant,了解一下,无非就这些功能, 编 ...

  2. MongoDB学习笔记-游标

    理解MongoDB的游标有两种维度:客户端和服务器端.下面将从这两方面来说明. 客户端 find方法返回值是一个游标.可以通过游标来对最终结果进行控制.比如限制结果数量,略过某一部分,根据任意键按任意 ...

  3. 【BZOJ 2809】 [Apio2012]dispatching

    Description 在一个忍者的帮派里,一些忍者们被选中派遣给顾客,然后依据自己的工作获取报偿.在这个帮派里,有一名忍者被称之为 Master.除了 Master以外,每名忍者都有且仅有一个上级. ...

  4. JavaScript深复制

    转载:http://blog.csdn.net/wanmingtom/article/details/7988284 这原本是StackOverFlow里的一个提问,看到答案后受益良多,于是翻译一下下 ...

  5. Mac系统如何配置adb

    在使用mac进行android开发之前,我们一般会安装android studio 或者 eclipse,无论哪一款开发软件,都少不了安装adb(Android Debug Bridge).adb(A ...

  6. 网件无线网卡在windows 2012支持问题

    网件的无线网卡的驱动是支持windows 8.1的,但是安装了驱动后,却没法启动网卡.网上搜索后发现,service里面网件有一进程没法启动:而2012年忘记官方论坛技术支持答复咨询居然说,网件驱动不 ...

  7. 【Reorder List】cpp

    题目: Given a singly linked list L: L0→L1→…→Ln-1→Ln,reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→… You must do ...

  8. Eclipse : cannot open output file(c++)

    之前电脑卡的时候 强制关闭Eclipse,结果打开再次运行的时候却不能输出了:找了网上的原因,是之前那个进程还未关闭 开发环境  Eclipse  for C/C++  &  MinGW Er ...

  9. 【POJ】【2601】Simple calculations

    推公式/二分法 好题! 题解:http://blog.csdn.net/zck921031/article/details/7690288 这题明显是一个方程组……可以推公式推出来…… 然而这太繁琐了 ...

  10. apple开发者账号申请

    1.  登陆appleID. 2. 进入 Your Account 3. 在Account Summary 中的MemberShips中选择第一个(界面大概如下) 4.选择后进入下图. 5. yes ...