前言

初等数论在OI中应用的基础部分,同机房的AuSquare和zhou2003君早就写完了,一直划水偷懒的Hk-pls表示很方,这才开始了这篇博客.

\(P.S.\)可能会分部分发表。

Base-1

筛法求素数

埃式筛素数

问题:求\([1,n]\)中的所有素数

总体思路就是在\([2,n]\)中每当我们找到一个新的素数,在把它加入我们的素数队列的同时我们把它的倍数全部打上标记(包括它自己),下一个没有被标记的数就是新的素数。

void find_prime(int n){
memset(used,0,sizeof(used));cnt=0;
for (int i=2;i<=n;++i){
if (!used[i]) {prm[++cnt]=i;
for (int j=1;(i*j)<=n;++j) used[i*j]=1;}
}
}

这种方法简单粗暴,非常好写,且可以适用于很多种情况,但是,因为一个合数可能包含多个质因子这个算法就会不可避免地产生重复标记的情况,产生时间上的弊端。于是——

欧拉筛法

欧拉筛法是一种经典的线性筛法,顾名思义,欧拉筛法的时间复杂度为\(O(n)\)

同样地,欧拉筛法也是根据一个核心原理:每个合数必定可以被它的最小的质因子筛掉。

void euler(int N){
memset(used,0,sizeof(used));cnt=0;
for (int i=2;i<=n;++i){
if (!used[i]) prm[++cnt]=i;
for (int j=1;j<=cnt;++j)
{used[i*prm[j]]=prm[j];if (!(i%prm[j])) break;}
/*这句话是重点:如果找到了i的最小质因子prm[j]我们就立马退出,
因为剩下的没有标记的数将会在其他数的prm[j]倍中出现而被标记,
例如:i=6在prm[j]=2之后退出,而它剩下未标记的18则会在i=9时被标记*/
}
}

于是由于及时地跳出,欧拉筛法的时间优势得以产生。

例题:[USACO08DEC]拍头Patting Heads

欧拉函数

定义\([1,n]\)中与\(n\)互素的数的个数为\(\phi(n),\)设\(n\)的素数表达式为\(n=p_1^{a_1}\times p_2^{a_2}\times \cdots\times p_n^{a_n}\)则:

\[\varphi(n)=n\times(\frac{p_1-1}{p_1})\times(\frac{p_2-1}{p_2})\times\cdots\times(\frac{p_n-1}{p_n})=n\times\prod_{质数p|n}(\frac{p-1}{p})
\]

证明:(来自李煜东的《算法竞赛进阶指南》)

利用容斥原理。

令\(p,q\)为\(n\)的不同的质因子,在\([1,n]\)中,能整除\(p\)的有\(\frac{n}{p}\)个能整除\(q\)的有\(\frac{n}{q}\)个,但是可能会有\(p,q\)的倍数被重复减去的情况,所以我们需要在后面补上一个\(\frac{n}{pq}\),则有:

\[n-\frac np-\frac nq+\frac{n}{pq}=n\cdot(1-\frac1p-\frac1q+\frac1{pq})=n\cdot(1-\frac1p)\cdot(1-\frac1q)
\]

同理可得欧拉函数。

性质

  1. 若\(n\)为素数,则有:\(\varphi (n)=n-1\)

  2. 欧拉函数是积性函数

  3. 如果有\(p|n\),且\(p^2|n,\)则\(\varphi (n)=\varphi (n/p)\cdot p\)。

    因为\(n\)和\(n/p\)包含相同的质因子,只是\(n\)的因子中的\(p\)的指数比\(n/p\)多\(1\),由前面的欧拉函数的公式可知,指数不影响\(\varphi (n)\),这种情况下只有\(n\)会影响\(\varphi (n)\),所以在这里,\(\varphi (n)=\varphi(n/p)\cdot p\)成立. 证毕。

求法

求\(\varphi(n)\)

本来我还以为这个就是个理论知识补充不会用来写的,然后上午写的博客,下午打的脸

int eular(int n){
int apx=2,ans=n;
while (apx*apx<=n){
if (n%apx==0) ans=ans*(apx-1)/apx;
while (n%apx==0) n/=apx;apx++;}
if (n>1) ans=ans*(n-1)/n;
return ans;
}

求所有\(\varphi(i),i\in[1,n]\)

void eular(int n){
for (int i=2;i<=n;++i){
if (!used[i]) {prm[++cnt]=i;phi[i]=i-1;}
for (int j=1;j<=cnt;++j){
if (prm[j]*i>n) break;
used[prm[j]*i]=1;
if (!(i%prm[j])) {phi[i*prm[j]]=phi[i]*prm[j];break;}
//有没有发现这个写法和欧拉筛法十分的像?且这里要用上性质三
else phi[i*prm[j]]=phi[i]*(prm[j]-1);
//这里利用了欧拉函数是积性函数的性质
}
}
}

例题:【SDOI2012】Longge的问题

欧几里得辗转相除法(Euclid's algorithm)

我相信这个式子应该是非常有名的

\[gcd(a,b)=gcd(b,a\space mod\space b)$$ 这里的$gcd(a,b)$指的是$a,b$的最大公因数。

令$gcd(a,b)=c,a\space mod\space b=d$,设$a=xc,b=yc,$
则$d=a-kb,k\in Z$
$d=a-kb=(x-ky)\cdot c$
故$c$一定也是$b,d$的因数,

若$(x-ky),y$不互素,则一定有$(x-ky)=e\cdot g,y=f\cdot g$,
则又有$x=ky+eg=kfg+eg=(kf+e)g$,
$a,b$可重新表示为$a=(kf+e)gc,b=fgc$,但此时$gcd(a,b)=cg,$与前面矛盾,
故$(x-ky),y$互素,则此时$gcd(b,a\space mod \space b)=gcd(a,b)=c$

即$gcd(a,b)=gcd(b,a\space mod\space b)$

证明完毕\]

初等数论-Base-1(筛法求素数,欧拉函数,欧几里得算法)的更多相关文章

  1. √n求单值欧拉函数

    基本定理: 首先看一下核心代码: 核心代码 原理解析: 当初我看不懂这段代码,主要有这么几个问题: 1.定理里面不是一开始写了一个n*xxx么?为什么代码里没有*n? 2.ans不是*(prime[i ...

  2. 素数&欧拉函数

    素数表 const int maxN找[1,maxN)内的素数 int prime[int I]第I个素数 const int maxN=1e5+5; int prime[maxN]; bool ma ...

  3. 求逆欧拉函数(arc)

    已知欧拉函数计算公式 初始公式:φ(n)=n*(1-1/p1)*(1-1/p2).....*(1-1/pm)   又 n=p1^a1*p2^a2*...*ps^as  欧拉函数是积性函数 那么:φ(n ...

  4. Bzoj-2818 Gcd 欧拉函数

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2818 题意:给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x ...

  5. O(n)求素数,求欧拉函数,求莫比乌斯函数,求对mod的逆元,各种求

    筛素数 void shai() { no[1]=true;no[0]=true; for(int i=2;i<=r;i++) { if(!no[i]) p[++p[0]]=i; int j=1, ...

  6. 欧拉函数O(sqrt(n))与欧拉线性筛素数O(n)总结

    欧拉函数: 对正整数n,欧拉函数是少于或等于n的数中与n互质的数的数目. POJ 2407.Relatives-欧拉函数 代码O(sqrt(n)): ll euler(ll n){ ll ans=n; ...

  7. 洛谷 P3383 【模板】线性筛素数-线性筛素数(欧拉筛素数)O(n)基础题贴个板子备忘

    P3383 [模板]线性筛素数 题目描述 如题,给定一个范围N,你需要处理M个某数字是否为质数的询问(每个数字均在范围1-N内) 输入输出格式 输入格式: 第一行包含两个正整数N.M,分别表示查询的范 ...

  8. (hdu step 7.2.1)The Euler function(欧拉函数模板题——求phi[a]到phi[b]的和)

    题目: The Euler function Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...

  9. 洛谷P2568 GCD (欧拉函数/莫比乌斯反演)

    P2568 GCD 题目描述 给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x,y)有多少对. 输入输出格式 输入格式: 一个整数N 输出格式: 答案 输入输出样例 输入 ...

  10. A - Bi-shoe and Phi-shoe 欧拉函数

    /** 题目:A - Bi-shoe and Phi-shoe 链接:https://vjudge.net/contest/154246#problem/A 题意:每一个数都有一个得分,它的得分就是, ...

随机推荐

  1. PHP实现快速排序算法相关案例

    <?php /** * 快速排序 --主要运用递归, 先把一个数找准位置,然后再递归把左右两边的数都找准位置 */ function QSort($a= []){ $nCount = count ...

  2. UML-类图-构造型应用场景是什么?

    1.什么是构造型? 抽象出来的标准的模型元素. 2.有哪些? 1.预定义的,如:<<destory>> 2.自定义的 3.自定义

  3. Salt常用命令二

    ############################模块############################ 查看模块列表——module salt ‘minion’  sys.list_mo ...

  4. blocking(非阻塞)回调函数

    回调函数不会造成阻塞 function loop() { setTimeout(loop, 0) } loop 死循环 while(true)

  5. 884A. Book Reading#抽空学习好孩子(模拟)

    题目出处:http://codeforces.com/problemset/problem/884/A 题目大意:每天时间分两部分,工作和学习,工作优先,闲暇读书,问第几天读完 #include< ...

  6. windows之anaconda导入torch失败和pip install命令执行read time out

    昨天用jupyter导入torch还好好的呢,今天用就不行了,先是ImportError: DLL load failed: 找不到指定的模块.再是No such comm target regist ...

  7. 简单总结------redis

    一.Redis 是一个基于内存的高性能key-value数据库. 二.端口 6379 三.特点: Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库统统加载在 ...

  8. CodeForces 1005D Polycarp and Div 3(思维、贪心、dp)

    http://codeforces.com/problemset/problem/1005/D  题意: 给一个仅包含数字的字符串,将字符串分割成多个片段(无前导0),求这些片段里最多有多少是3的倍数 ...

  9. SVN一直清理解决

    svn作为我们经常使用的版本管理服务器,在使用过程中经常需要通过clean up操作来完成本地文件与服务器文件信息及版本信息同步,然而有时会在执行清理命令时提示“清理失败,请执行清理”,并且提示的中文 ...

  10. EMD——EEMD——CEEMD语音增强算法基础

    首先,HHT中用到的EMD详细介绍:https://wenku.baidu.com/view/3bba7029b4daa58da0114a9a.html 本文具体参考 https://zhuanlan ...