【POJ2478】Farey Seque
题意:

就是求2~n的所有欧拉函数值的和,这里就用到了快速求欧拉函数的方法。(不能暴力求了,不然必定TLE啊)
说说欧拉筛法,感觉十分机智啊~~

对于上述代码的几个问题:
1.问:为什么i%prime==0时break?
答:欧拉筛法每次合成时都是用最小质因子合成的,如果我们在程序加一行记录,即可先行求出1~Maxn的最小质因子。这样避免不必要的重复,提高效率。
2.为什么当i%prime[j]==0时,phi[i*prime[j]]=phi[i]*prime[j]? 否则,phi[i*prime[j]]=phi[i]*(prime[j]-1)?
答:这是欧拉函数的几个性质哦,下面说说这个东西的证明。
欧拉函数的几个性质:E(x)表示比x小的且与x互质的正整数的个数。
1、*若p是素数,E(p)=p-1。
2、*E(p^k)=p^k - p^k /p = p* p^(k-1) - 1* p^(k-1) = (p-1)*p^(k-1)
证明如下:

最后一行有点难理解,解释一下:
假设a和b并不互质,b是质数,a是b的倍数。gcd(a,b)=b。E(a)和E(b)中都有一项(b-1)*b^0->(b-1),我们E(ab)的算式中间就有一项(b-1)*b,而E(a)和E(b)相乘后会变成(b-1)^2,所以在E(a)*E(b)的同时还要乘上b/b-1才能是结果正确,那么E(a*b)=E(a)*E(b)*b/b-1。因为b是质数,所以E(b)=b-1,所以有E(a*b)=E(a)*b。
因此,我们得到两个推论咯:
1、 当n为奇数时,E(2n)=E(n)
2、 当n是一个大于2的正整数时,E(n)是偶数
目前还没有发现这两个推论的用处,可以先记一记。不过上述两个性质是很重要哒~~~
这题的代码如下:
#include<cstdio>
#include<cstring>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
#define Maxn 1000000
#define LL long long int phi[Maxn+],prime[Maxn+];
LL h[Maxn+];
bool vis[Maxn+]; void ffind()
{
memset(vis,,sizeof(vis));
int len=;
for(int i=;i<=Maxn;i++)
{
if(!vis[i]) prime[++len]=i,phi[i]=i-;
for(int j=;j<=len;j++)
{
if(i*prime[j]>Maxn) break;
vis[i*prime[j]]=;
if(i%prime[j]==)
{
phi[i*prime[j]]=phi[i]*prime[j];
break;
}
else phi[i*prime[j]]=phi[i]*(prime[j]-);
}
}
h[]=;
for(int i=;i<=Maxn;i++) h[i]=h[i-]+phi[i];
//for(int i=2;i<=20;i++) printf("%d:%d\n",i,phi[i]);
} int main()
{
int n;
ffind();
while()
{
scanf("%d",&n);
if(n==) break;
printf("%lld\n",h[n]);
}
return ;
}
poj24778
感觉这种题就是,看着别人的题解做,理解思路比打代码花的时间多了去了。数论一定要好好理解透彻啊~~
2016-02-04 16:42:48
【POJ2478】Farey Seque的更多相关文章
- 【poj2478】 Farey Sequence
http://poj.org/problem?id=2478 (题目链接) 题意 求分母小于等于n的真分数的个数. Solution 现在只能做做水题了,唉,思维僵化. 细节 前缀和开LL 代码 // ...
- 【poj2478】Farey Sequence
题意: 求前n项的欧拉函数之和 题解: 预处理出所有欧拉函数 赤裸裸的模版题- - 没什么好说的 代码: #include <cstdio> typedef long long ll; ; ...
- 【规律】Farey Sums
[参考博客]: https://blog.csdn.net/meopass/article/details/82952087 Farey Sums 题目描述 Given a positive inte ...
- 【POJ 2478】 Farey Sequence
[题目链接] 点击打开链接 [算法] 不难看出,ans = phi(2) + phi(3) + .... + phi(n-1) + phi(n) 线性筛筛出欧拉函数,预处理前缀和,即可 [代码] #i ...
- Python高手之路【六】python基础之字符串格式化
Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...
- 【原】谈谈对Objective-C中代理模式的误解
[原]谈谈对Objective-C中代理模式的误解 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这篇文章主要是对代理模式和委托模式进行了对比,个人认为Objective ...
- 【原】FMDB源码阅读(三)
[原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而 ...
- 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新
[原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...
- 【调侃】IOC前世今生
前些天,参与了公司内部小组的一次技术交流,主要是针对<IOC与AOP>,本着学而时习之的态度及积极分享的精神,我就结合一个小故事来初浅地剖析一下我眼中的“IOC前世今生”,以方便初学者能更 ...
随机推荐
- [Labview资料] labview事件结构学习
编程的主要目的是为了实现用户的某种功能,用户通过用鼠标.键盘.程序内部等触发某种程序动作,从而达到某种结果,这些操作都被称作为事件,LabVIEW中相应这些事件最常用的结构就是“事件结构”.事件结 ...
- 阿里云SQL Server 2008 客户端导入数据库教程
一.适用场景 源端数据库是SQL Server 2005 及以上.(SQL Server 2000未测试.) 数据文件总大小在10G以内. 可以在低峰期停应用. 二.导出步骤 1.软件准备 ...
- WPF中将DataGrid导出Excel
int number = 1; private void MenuItem_Click(object sender, RoutedEventArgs e) { #region string path ...
- Linux下搭建Oracle11g RAC(9)----创建RAC数据库
接下来,使用DBCA来创建RAC数据库. ① 以oracle用户登录图形界面,执行dbca,进入DBCA的图形界面,选择第1项,创建RAC数据库: ② 选择创建数据库选项,Next: ③ 选择创建通用 ...
- Mybatis中实现oracle的批量插入、更新
oracle 实现在Mybatis中批量插入,下面测试可以使用,在批量插入中不能使用insert 标签,只能使用select标签进行批量插入,否则会提示错误 ### Cause: java.sql.S ...
- http协议通信原理的问答
1.dns怎么解析?答:假设一个网站www.tianyik.com的ip是192.168.31.36 浏览器(URL:www.tianyik.com)--> 客户机 h ...
- ASCII 对应表 CHR()
chr(9) tab空格 chr(10) 换行 chr(13) 回车 chr(13)&chr(10) 回车换行 chr(32) 空格符 ...
- java 子类重写父类的方法应注意的问题
若想实现一个合格重写方法,而不是重载,那么必须同时满足下面的要求! A.重写规则之一: 重写方法不能比被重写方法限制有更严格的访问级别.(但是可以更广泛,比如父类方法是包访问权限,子类的重写方法 ...
- JavaScript实现多栏目切换效果
效果: 代码: <!doctype html> <html> <head> <meta http-equiv="Content-Type" ...
- [网络] C# NetHelper网络通信编程类教程与源码下载
点击下载 NetHelper.zip 主要功能如下所示 检查设置的IP地址是否正确,返回正确的IP地址 检查设置的端口号是否正确,返回正确的端口号 将字符串形式的IP地址转换成IPAddress对象 ...