【模板】埃拉托色尼筛法 && 欧拉筛法 && 积性函数
埃拉托色尼筛法
朴素算法
1 vis[1]=1;
2 for (int i=2;i<=n;i++)
3 if (!vis[i])
4 {
5 pri[++tot]=i;
6 for (int j=i*2;j<=n;j+=i)
7 vis[j]=1;
8 }
欧拉筛法
朴素算法
vis[]=;
for (int i=;i<=n;i++)
{
if (!vis[i])
pri[++tot]=i;
for (int j=;j<=tot;j++)
{
if (i*pri[j]>n) break;
vis[i*pri[j]]=;
if (i%pri[j]==) break;
}
}
以luoguP3383为例
标程:
#include<bits/stdc++.h>
using namespace std;
int prime[],mark[];
int bj,ph[];
void oula(int p){
ph[]=;
for(int i=;i<=p;i++) {
if(!mark[i]){
prime[++bj] = i;
ph[i]=i-;
}
for(int j=;j<=bj;j++){
if(i*prime[j]>p) break;
mark[i*prime[j]]=;
if(i%prime[j]==) {
ph[i*prime[j]]=ph[i]*prime[j];
break;
}
else ph[i*prime[j]]=ph[i]*ph[prime[j]];
}
}
}
int n,m1;
int main(){
cin>>n>>m1;
oula(n);
for(int i=;i<=m1;i++) {
int m;
cin>>m;
if(m-!=ph[m]) cout<<"No"<<endl;
else cout<<"Yes"<<endl;
}
return ;
}
以下内容为转载于https://blog.csdn.net/y20070316/article/details/51729812
二. 欧拉筛法解积性函数
1. 方法
步骤Ⅰ:证明积性
步骤Ⅱ:考虑下面三方面的实现:
①素数m,求f(m)
②m和比m的最小素因子小的素数n,求f(n*m)
③m和m的最小素因子n:求f(n*m)2. 例子
(1)欧拉函数
题目:PC 1499
证明:设[Math Processing Error]n=∏aipi,m=∏biqi,且[Math Processing Error]gcd(m,n)=1
[Math Processing Error]∴ϕ(mn)=mn∏(1−1ai)∏(1−1bi)=[n∗∏(1−1ai)]∗[m∗(∏(1−1bi)]=ϕ(n)ϕ(m)写法:
①素数m:[Math Processing Error]ϕ(m)=m−1
②m和比m的最小素因子小的素数n:
[Math Processing Error]ϕ(m∗n)=ϕ(m)∗phi(n)
③m和m的最小素因子n:[Math Processing Error]ϕ(m∗n)=ϕ(m)∗nphi[]=;
for (int i=;i<=n;i++)
{
if (!phi[i])
{
pri[++tot]=i;
phi[i]=i-;
}
for (int j=;j<=tot;j++)
{
if (i*pri[j]>n) break;
if (i%pri[j]!=)
phi[i*pri[j]]=phi[i]*phi[pri[j]];
else
{
phi[i*pri[j]]=phi[i]*pri[j];
break;
}
}
}(2)莫比乌斯函数
题目:PC 1492
积性证明:
设[Math Processing Error]n=∏aipi,m=∏biqi,且[Math Processing Error]gcd(m,n)=1
①若[Math Processing Error]∃pi>1或[Math Processing Error]qi>1,则[Math Processing Error]μ(n∗m)=μ(n)∗μ(m)=0
②否则,[Math Processing Error]μ(n∗m)=(−1)n+m=μ(n)∗μ(m)
综上,[Math Processing Error]μ(n∗m)=μ(n)∗μ(m)写法:
①素数m:[Math Processing Error]μ(m)=−1
②m和比m的最小素因子小的素数n:
[Math Processing Error]μ(m∗n)=μ(m)∗μ(n)
③m和m的最小素因子n:[Math Processing Error]μ(n∗m)=0mu[]=vis[]=;
for (int i=;i<=n;i++)
{
if (!vis[i])
{
mu[i]=-;
pri[++tot]=i;
}
for (int j=;j<=tot;j++)
{
if (i*pri[j]>n) break;
vis[i*pri[j]]=;
if (i%pri[j]!=)
mu[i*pri[j]]=mu[i]*mu[pri[j]];
else
{
mu[i*pri[j]]=;
break;
}
}
}(3) 乘法逆元[Math Processing Error]inv(n,i)([Math Processing Error]n不变)
题目:PC 1494
积性证明:
[Math Processing Error]∵a∗inv[a]≡1,b∗inv[b]≡1(modn)
[Math Processing Error]∴(a∗b)∗(inv[a]∗inv[b])≡1(modn)
[Math Processing Error]∴inv[a∗b]≡inv[a]∗inv[b]写法:
①素数m:根据费马小定理,[Math Processing Error]inv[m]≡Pow(m,n−2)
②m和比m的最小素因子小的素数n:[Math Processing Error]inv[m∗n]=inv[m]∗inv[n]
③m和m的最小质因子n:
根据完全积性,[Math Processing Error]inv[m∗n]=inv[m]∗inv[n]注意,第①步是[Math Processing Error]O(n)的。这是因为:
[Math Processing Error]O(π(n)logn)=O(nlnnlogn)=O(nlognlogn)=O(n)。vis[]=inv[]=;
for (int i=;i<n;i++)
{
if (!vis[i])
{
pri[++tot]=i;
inv[i]=Pow(i,n-);
}
for (int j=;j<=tot;j++)
{
if (i*pri[j]>n) break;
vis[i*pri[j]]=;
inv[i*pri[j]]=inv[i]*inv[pri[j]];
if (i%pri[j]==) break;
}
}其实可以直接有一种递推的方法:
①当n=1时,inv[n]=1
②假设当前对于k,已经求出了inv[1],inv[2],…,inv[k-1],当前要求出inv[k]。
令[Math Processing Error]a=nmodk,[Math Processing Error]b=n/k
[Math Processing Error]∴n=a+b∗k
[Math Processing Error]∴a=n−b∗k
又[Math Processing Error]∵inv[a]∗a≡inv[a]∗(n−b∗k)≡inv[a]∗−b∗k≡1
[Math Processing Error]∴inv[k]=−b∗inv[a](4)最大公约数[Math Processing Error]gcd(a,b)(b一定)
题目:PC 1495
证明:略
写法:求[Math Processing Error]g(i)
①素数m:[Math Processing Error]g(m)=gcd(m,b);
②m和比m的最小素因子小的素数n:
[Math Processing Error]g(m∗n)=g(m)∗g(n);
③m和m的最小质因子n:
设[Math Processing Error]ek(m)表示n的最大的幂,满足[Math Processing Error]ek(m)|m
若[Math Processing Error](ek(m)∗n)|b,则[Math Processing Error]g(m∗n)=g(m)∗n
若不满足,则[Math Processing Error]g(m∗n)=g(m);[Math Processing Error]ek(i)不是积性函数,但也可以放在欧拉筛法里面求:
①素数m:[Math Processing Error]ek(m)=m
②m和比m的最小素因子小的素数n:[Math Processing Error]ek(m∗n)=n
③m和m的最小质因子n:[Math Processing Error]ek(m∗n)=ek(m)∗n(5)正因子数目[Math Processing Error]d(n)
题目:PC 1496
证明:
设[Math Processing Error]m=∏aipi,[Math Processing Error]n=∏biqi且[Math Processing Error]m,n互质
[Math Processing Error]∴d(mn)=d(∏aipi∏biqi)=∏(pi−1)∏(qi−1)=d(m)∗d(n)求法:求[Math Processing Error]d(i)
①素数m:[Math Processing Error]d(m)=2
②m和比m的最小素因子小的素数n:[Math Processing Error]d(m∗n)=d(m)∗d(n)
③m和m的最小质因子n:
[Math Processing Error]d(m∗n)=d(m)/(e(m)+1)∗(e(m∗m)+1),[Math Processing Error]e(m)表示最大的满足[Math Processing Error]ne(m)|m的值。求[Math Processing Error]e(i):
①素数m:[Math Processing Error]e(m)=1
②m和比m的最小素因子小的素数n:[Math Processing Error]e(m∗n)=1
③m和m的最小质因子n:[Math Processing Error]e(m∗n)=e(m)+1(6)正因子之和[Math Processing Error]s(n)
题目:PC 1497
证明:
设[Math Processing Error]m=∏aipi,[Math Processing Error]n=∏biqi且[Math Processing Error]m,n互质,
则[Math Processing Error]s(m∗n)=∏j(∑j=0piaij)∗∏j(∑j=0qibij)=s(m)s(n)写法:
①素数m:[Math Processing Error]s(m)=m+1
②m和比m的最小素因子小的素数n:[Math Processing Error]s(m∗n)=s(m)∗s(n)
③m和最小质因数n:
[Math Processing Error]s(m∗n)=s(∏aipi∗ne(i)+1)=∏(∑j=0piaij)∗(∑j=0e(i)+1nj)=s(m)∗(∑j=0e(i)+1nj)(∑j=0e(i)nj)=s(m)∗ne(i)+2−1n−1∗n−1ne(i)+1−1=s(m)∗ne(i)+2−1ne(i)+1−1记[Math Processing Error]pe(m)=ne(i)+1,则可以在欧拉筛法的同时求出。
(8)另一些显而易见的积性函数
1(n):1(n)=1,完全积性
Id(n):Id(n)=n,完全积性
Idk(n):Idk(n)=n^k,完全积性3. 实现技巧
(1)节省空间
很多时候,有些数组A可以当作另外一些数组B的功能拓展,这时候就可以把B省略掉。
例如,在求欧拉函数的时候,我们可以用phi来取代vis数组。因为没有求出来的phi(i)也就意味着i是素数。
又例如,在求莫比乌斯函数的时候,我们可以用mu来取代vis数组。理由同上。不过要把mu数组的初始值设为-1。
(2)模板
变量:
- 布尔数组vis[N]
- 素数表pri[N],tot
- 积性函数
模板:
void solve(void)
{
vis[]=...=; //赋初始值
for (int i=;i<=n;i++)
{
if (!vis[i])
{
... //素数的积性函数值
pri[++tot]=i; //加入素数表
}
for (int j=;j<=tot;j++)
{
if (i*pri[j]>n) break;
vis[i*pri[j]]=;
... //公共部分
if (i%pri[j]!=)
{
... //m和比m的最小素因子小的素数n的处理
}
else
{
... //m和m的最小素因子n的处理
break;
}
}
}
}4. 变式
(1)“加性”函数
例题:PC 1498
有些涉及到素因子的函数,也可以使用欧拉筛法求解。很多时候可以辅助积性函数的求解,上面的例子中的[Math Processing Error]e函数,[Math Processing Error]ek函数就是所谓的“加性”函数。(2)[Math Processing Error]A2
例题:XSY 1001
对于[Math Processing Error]A2的积性函数,关键求出[Math Processing Error]A的积性函数,然后顺便求解[Math Processing Error]A2的积性函数。(3)[Math Processing Error](A+1)(A−1)
例题:XSY 1001
通常一个乘积的形式,也可以通过互质的关系,转化为有关积性函数的问题。
【模板】埃拉托色尼筛法 && 欧拉筛法 && 积性函数的更多相关文章
- 素数判断-----埃氏筛法&欧拉筛法
埃氏筛法 /* |埃式筛法| |快速筛选素数| |15-7-26| */ #include <iostream> #include <cstdio> using namespa ...
- 欧拉筛法模板&&P3383 【模板】线性筛素数
我们先来看欧拉筛法 •为什么叫欧拉筛呢?这可能是跟欧拉有关 •但是为什么叫线性筛呢?因为它的复杂度是线性的,也就是O(n),我们直接来看代码 #include<cstdio> #inc ...
- 素数筛总结篇___Eratosthenes筛法和欧拉筛法(*【模板】使用 )
求素数 题目描述 求小于n的所有素数的数量. 输入 多组输入,输入整数n(n<1000000),以0结束. 输出 输出n以内所有素数的个数. 示例输入 10 0 示例输出 4 提示 以这道题目为 ...
- [洛谷P3383][模板]线性筛素数-欧拉筛法
Description 如题,给定一个范围N,你需要处理M个某数字是否为质数的询问(每个数字均在范围1-N内) Input&Output Input 第一行包含两个正整数N.M,分别表示查询的 ...
- 欧拉函数 &【POJ 2478】欧拉筛法
通式: $\phi(x)=x(1-\frac{1}{p_1})(1-\frac{1}{p_2})(1-\frac{1}{p_3}) \cdots (1-\frac{1}{p_n})$ 若n是质数p的k ...
- 积性函数&线性筛&欧拉函数&莫比乌斯函数&因数个数&约数个数和
只会搬运YL巨巨的博客 积性函数 定义 积性函数:对于任意互质的整数a和b有性质f(ab)=f(a)f(b)的数论函数. 完全积性函数:对于任意整数a和b有性质f(ab)=f(a)f(b)的数论函数 ...
- 积性函数初步(欧拉$\varphi$函数)
updata on 2020.4.3 添加了欧拉\(\varphi\)函数为积性函数的证明和它的计算方式 1.积性函数 设\(f(n)\)为定义在正整数上的函数,若\(f(1)=1\),且对于任意正整 ...
- POJ 2480 Longge's problem (积性函数,欧拉函数)
题意:求∑gcd(i,n),1<=i<=n思路:f(n)=∑gcd(i,n),1<=i<=n可以知道,其实f(n)=sum(p*φ(n/p)),其中p是n的因子.为什么呢?原因 ...
- 『素数 Prime判定和线性欧拉筛法 The sieve of Euler』
素数(Prime)及判定 定义 素数又称质数,一个大于1的自然数,除了1和它自身外,不能整除其他自然数的数叫做质数,否则称为合数. 1既不是素数也不是合数. 判定 如何判定一个数是否是素数呢?显然,我 ...
随机推荐
- 解决创建带有NameSpace的XML文件出现空白xmlns的问题
为了能够让用户自行部署ClickOnce应用程序,需要编写一个生成ClickOnce应用程序的ClickOnce专用安装程序setup.exe,而生成这个setup.exe的方法就是编写一个XML格式 ...
- FreePascal - 如何在各个平台中安装CodeTyphon!
安装CodeTyphon的操作系统: win10 X64 企业版 Ubuntu16.04 X64 Mac OS 10.11 虚拟机: VMware® Workstation 12 Pro 12.5.2 ...
- $_SERVER[]数组解析
$_SERVER['PHP_SELF'] 将会得到 /test.php/foo.bar 这个结果.__FILE__ 常量包含当前(例如包含)文件的绝对路径和文件名. 如果 PHP 以命令行方式运行,该 ...
- Apache Tomcat远程命令执行漏洞(CVE-2017-12615) 漏洞利用到入侵检测
本文作者:i春秋作家——Anythin9 1.漏洞简介 当 Tomcat运行在Windows操作系统时,且启用了HTTP PUT请求方法(例如,将 readonly 初始化参数由默认值设置为 fals ...
- SnapKit 类图
 如图上图所示,居于中心的是ConstraintDescription,它用来生成Constraint,最后再转换成系统的NSLayoutConstraint. ConstraintDescript ...
- iOS完全自学手册——[二]Hello World工程
1.前言 写第二篇文章之前,我在想第二篇应该怎么写?后来觉得与其写Objective-C语言的相关语法,不如直接开始写个小项目.语法简单入门即可.因为,即便把语法看的很深到最后还是不一定能做项目,运用 ...
- celery问题记录
1. 问题:WARNING/MainProcess] /home/jihonghe/.virtualenvs/py3_dj217_env/lib/python3.6/site-packages/bil ...
- 剑指offer三十八之二叉树的深度
一.题目 输入一棵二叉树,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度. 二.思路 递归,详见代码. 三.代码 public class So ...
- Vundle,Vim 的 Bundle(转)
长久以来,我管理 Vim 配置的方式都非常原始—— zip 打包,然后发到邮箱上.偶尔会发生忘记备份,或者配置混淆的状况,不过由于懒筋发作,竟然这个方案就这么用了两年. 终有一天,我觉得这个方法太笨了 ...
- PullToRefreshListView 进入界面不能立即显示刷新控件的bug 解决方案
1.首先定位到PullToRefreshListView.java这个文件 2.找到onRefreshing(final boolean doScroll)方法 @Override protected ...