欧拉筛,线性筛,洛谷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 ...
随机推荐
- IIS配置Url重写实现http自动跳转https的重定向方法(100%解决)
引言 本文推荐阅读地址:https://www.52abp.com/BlogDetails/10008 这种文章网上可以说一搜一大把,但是我为什么还要写呢,因为一搜一把没把我气死,都是东抄西挪的东西, ...
- DSL 系列(1) - 扩展点的论述与实现
前言 DSL 全称为 domain-specific language(领域特定语言),本系列应当会很长,其中包含些许不成熟的想法,欢迎私信指正. 1. DSL 简述 我理解的 DSL 的主要职能是 ...
- 07 YAPI/基础设施 - DevOps之路
07 YAPI/基础设施 - DevOps之路 文章Github地址,欢迎start:https://github.com/li-keli/DevOps-WiKi 简介 YApi 是一个可本地部署的. ...
- MySQL数据类型--日期和时间类型
MySQL中的多种时间和格式数据类型 日期和时间类型是为了方便在数据库中存储日期和时间而设计的.MySQL中有多种表示日期和时间的数据类型. 其中,year类型表示时间,date类型表示日期,time ...
- Django 2.0 学习
Django django是基于MTV结构的WEB框架 Model 数据库操作 Template 模版文件 View 业务处理 在Python中安装django 2.0 1 直接安装 pip inst ...
- 【kindle笔记】之 《黑客微百科》-2018-6-17
前段时间复习六级的时候,从图书馆看到一本书,然后带回来了.今天开始读.今天是2018年6月17日. 严格来讲,一本不算kindle笔记的笔记,不过广义的啃豆笔记了解一下.哈哈. 首页说到的黑客理念是: ...
- gethostbyname用法
//会优先查询解析%windir%\system32\drivers\etc\hosts中静态dns表 //一个域名可对应多个IP hostent->h_addr_list ==> 是in ...
- spring boot中log4j冲突问题和解决办法
Spring Boot中自带了log4j日志管理.写法应该是: private static final Logger logger = Logger.getLogger(XXX.class); 而不 ...
- java类库
Java的应用程序接口(API)以包的形式来组织,每个包提供大量的相关类.接口和异常处理类,这些包的集合就是Java的类库. Java类库可以分为两种 包名以java开始的包是Java核心包(Java ...
- [官网]Linux版本历史
This is a list of links to every changelog. https://kernelnewbies.org/LinuxVersions 总结一下 2.6.x 存在了八年 ...