欧拉筛,线性筛,洛谷P2158仪仗队
首先我们先把题目分析一下。
emmmm,这应该是一个找规律,应该可以打表,然后我们再分析一下图片,发现如果这个点可以被看到,那它的横坐标和纵坐标应该互质,而互质的条件就是它的横坐标和纵坐标的最大公约数为一,那这题的意思就变成了,在一个n * n的方格内寻找所有点的横坐标和纵坐标互质的点的个数。
但是这样复杂度肯定是过不去的。打表时间花费也是很多的,所以我们需要找到加快速度的方法,就是用欧拉函数来加快速度,所以我们就要实现大的优化,我们先明确欧拉函数是个什么东西.
欧拉函数
\(φ(x)\)表示在\(1\)到\(x - 1\)中所有与x互质的数的个数。这个函数一般就叫做欧拉函数。这个函数还具有一些性质.
- 如果\(x\)是质数,那\(φ(x)=x-1\)。(质数的性质就是这样)
- 若\(m\)与\(n\)互质,那\(φ(n * m)= φ(n)* φ(m)\).(可以根据乘法原理推出)
- 当\(x\)是质数时,那\(φ (x^k)=(x-1)×x^{k-1}\)
所以我们可以通过观察和推算发现,如果想求出结果,那就是对于图的每个横坐标,都记录他的欧拉函数的值,然后加起来就是最终结果。然后把结果乘2,因为纵坐标也需要进行一波这样的操作。最后再加上一(因为2,2这个点也算)
那到底应该怎么筛使得欧拉函数能够很快的算出来呢。
线性筛和欧拉筛
这里我们就要引进两个算法——线性筛和欧拉筛。
线性筛是指以线性的时间筛素数,欧拉筛是以线性的时间求出欧拉函数。
而且他们之间有着异曲同工之妙。
线性筛
代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
#define maxn 100010
int prime[maxn];//表示第几个质数。
bool vis[maxn] = {0, 1};//判断是否为质数,如果是则为0
int tot;
int main()
{
int n, m;
scanf("%d", &n);
for (int i = 2; i <= n; i++)
{
if (!vis[i])
prime[++tot] = i;
for (int j = 1; j <= tot, prime[j] * i <= n; j++)
{
vis[i * prime[j]] = 1;
if (!(i % prime[j]))//如果i能被prime[j]整除的话
break;
}
}
}
我们分析上面的代码,唯一可能难理解的地方就是\(break\)的那个判断了。这也是欧拉筛的精髓所在,如果已经超出了范围需要退出,这个自不必多说,但是,如果\(i\%prime[j]==0\)时,为啥就要退出呢
原理:
首先我们需要明白一些性质:
我们筛素数时应该从小到大筛,方便后面优化时间,所以源代码循环中\(i\)是从小到大筛的。
任何一个合数都可以表示为几个质数的乘积。所以我们想要在线性时间内筛素数的话,每个合数应该都只被它的最小质因子筛去。
当\(i\%prime[j]==0\)时,则\(i\)为\(prime[j]\)的倍数,设\(i\)为\(prime[j]*k\),如果继续向下筛的话,下一个要筛的数是\(i*prime[j+1]=prime[j]*k*prime[j+1]\);此时要筛的数即\(i*prime[j+1]\)就已经被\(prime[j]\)筛去了,而根据性质1,\(prime[j]\)要比\(i\)小(因为\(i\)是\(prime[tot]\))。
因此时间复杂度是线性的。
欧拉筛
欧拉筛其实跟线性筛差不了多少。
首先我们应该熟记欧拉函数的性质。并且这种筛法还可以进行线性求积性函数。
原理
- 我们看线性筛的第二个性质,欧拉函数是不是也满足,因此防止多余的运算
代码
memset(isprime, 1, sizeof(isprime));
isprime[1] = false;
for (int i = 2; i <= listsize; i++)
{
if (isprime[i])
{
prime[++primesize] =i;
phi[i] = i - 1;//性质1
}
for (int j = 1; j <= primesize && i * prime[j] <= listsize; j++)
{
isprime[i * prime[j]] = false;
if (i % prime[j] == 0)//说明他们之间不互质,且i是prime[j]的倍数,就可以用性质3.
{
phi[i * prime[j]] = phi[i] * prime[j];
break;
}
phi[i * prime[j]] = phi[i] * (prime[j] - 1)//即phi[j];因为他们互质,所以可用性质1,2
}
}
欧拉筛,线性筛,洛谷P2158仪仗队的更多相关文章
- 【bzoj2401】陶陶的难题I “高精度”+欧拉函数+线性筛
题目描述 求 输入 第一行包含一个正整数T,表示有T组测试数据.接下来T<=10^5行,每行给出一个正整数N,N<=10^6. 输出 包含T行,依次给出对应的答案. 样例输入 7 1 10 ...
- 欧拉筛法模板and 洛谷 P3383 【模板】线性筛素数(包括清北的一些方法)
题目描述 如题,给定一个范围N,你需要处理M个某数字是否为质数的询问(每个数字均在范围1-N内) 输入格式 第一行包含两个正整数N.M,分别表示查询的范围和查询的个数. 接下来M行每行包含一个不小于1 ...
- 【bzoj2190】【仪仗队】欧拉函数+线性筛(浅尝ACM-J)
向大(hei)佬(e)势力学(di)习(tou) Description 作为体育委员,C君负责这次运动会仪仗队的训练.仪仗队是由学生组成的N * N的方阵,为了保证队伍在行进中整齐划一,C君会跟在仪 ...
- BZOJ4804 欧拉心算(莫比乌斯反演+欧拉函数+线性筛)
一通套路后得Σφ(d)μ(D/d)⌊n/D⌋2.显然整除分块,问题在于怎么快速计算φ和μ的狄利克雷卷积.积性函数的卷积还是积性函数,那么线性筛即可.因为μ(pc)=0 (c>=2),所以f(pc ...
- 【BZOJ2401】陶陶的难题I 欧拉函数+线性筛
[BZOJ2401]陶陶的难题I 题意:求,n<=1000000,T<=100000 题解:直接做是n*sqrt(n)的,显然会TLE,不过这题a和b都是循环到n,那么就可以进行如下的神奇 ...
- 洛谷 - P2158 - 仪仗队 - 欧拉函数
https://www.luogu.org/problemnew/show/P2158 好像以前有个妹子收割铲也是欧拉函数. 因为格点直线上的点,dx与dy的gcd相同,画个图就觉得是欧拉函数.但是要 ...
- HDU6434 Count【欧拉函数 线性筛】
HDU6434 I. Count T次询问,每次询问\(\sum_{i=1}^{n}\sum_{j=1}^{n-1}[gcd(i-j,i+j)=1]\) \(T\le 1e5, n \le 2e7\) ...
- Bzoj 2818: Gcd 莫比乌斯,分块,欧拉函数,线性筛
2818: Gcd Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 3241 Solved: 1437[Submit][Status][Discuss ...
- 洛谷 P2158 仪仗队
欧拉函数入门题... 当然如果有兴趣也可以用反演做...类似这题 题意就是求,方阵从左下角出发能看到多少个点. 从0开始给坐标 发现一个点能被看到,那么横纵坐标互质. 然后求欧拉函数的前缀和,* 2 ...
随机推荐
- Centos7 安装 Redis
关闭防火墙:systemctl stop firewalld.service #停止firewallsystemctl disable firewalld.service #禁止firewall开机启 ...
- ASP.NET MVC必须知道的那些事!
MVC的由来: 在MVC模式之前,View界面的呈现.用户交互操作的捕捉与相应.业务流程的执行以及数据的存储等都是在一起的,这种设计模式叫自治视图. 这重设计模式主要存在三大弊端: 重用性:业务逻辑与 ...
- Item 22: 当使用Pimpl机制时,在实现文件中给出特殊成员函数的实现
本文翻译自<effective modern C++>,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 如果你曾经同过久的编译时间斗争过,那么你肯定对Pi ...
- .net Core 调用微信Jsapi接口,H5解析二维码
项目里需要用到扫描二维码,自己实现,不会. 找到了两种解决方案: 通过reqrcode.js,这是一个前端解析二维码内容的js库.如果二维码比较清晰,用这种效果也不错 调用微信扫一扫功能,这种效果很好 ...
- MySQL之索引原理
--------------------------------------------------------------------------------堕落的状态,无疑是慢性自杀.想想自己为什 ...
- 第八次oo作业
作业五 作业五是当前最后一次电梯作业,也是我们第一次接触到多线程编程,输入方式也由之前的一次性输入变为了实时输入,其中涉及到大量的同步和冲突,其中学习多线程的使用也花了大量的时间,但总的来说为以后的作 ...
- hibernate添加数据时Exception in thread "main" org.hibernate.PropertyValueException: not-null property references a null or transient value: com.javakc.hibernate.test.entity.TestEntity.testName
意思是,一个非null属性引用了一个null或瞬态值.就是在对应实体类配置文件hbm.xml中该属性配置了not-null="true",将其去掉即可.
- Python的socket模块与交互式指令
socket简介 在编程的过程中,我们需要使用网络编程,这时我们不得不和网络通信的底层基础打交道了.我们必须让自己传输的数据符合网络通信的基本协议,即TCP/IP协议,但是网络通信协议本身很复杂.我们 ...
- spring security运行流程图(转)
原文:http://blog.csdn.net/u011511684/article/details/31394493 示例下载地址:http://download.csdn.net/detail/u ...
- 【学习总结】C-翁恺老师-入门-第0周<程序设计与C>
[学习总结]C-翁恺老师-入门-总 1-首先按视频说的下载编辑器 <DevC++> 并一路默认设置: 安装包下载链接 (我有vc6.0不过预感告诉我老师要用类似CS50里那种命令行编辑器? ...