[C++]请麻烦压一下定理的棺材板啦
从去年还在竞赛的时候2/12的原博客里搬运来的
不得不说之前取名真的很艺术qwq
今天开始上的数论课,让头发以肉眼可见的速度掉落emmm
没关系我头发多我不怕啦啦啦QwQ
其中最令人头疼的就是那些人名定理了,看到它们,总是在想:
我是谁
我从哪里来
我要做什么
咳咳,不是,是下面——
这是什么
怎么证明
代码实现
有什么用
其中怎么证明过于复杂了,一点也没听懂。数竞的事情关我们信竞什么事......
所以这篇博客将整理1/3/4的问题,理清楚欧拉费马欧几里得威尔逊等等名人定理之间的关系!【当然没有人名的定理也整呐!】
参考资料
预备知识
摘自百度百科
整除
若整数b除以非零整数a,商为整数,且余数为零, 我们就说b能被a整除(或说a能整除b)
e.g. 6÷2=3 (即6%2=3)
b为被除数,a为除数,即a|b(“|”是整除符号),a叫做b的约数(或因数),b叫做a的倍数。
约数
又称因数。整数a除以整数b(b≠0) 除得的商正好是整数而没有余数,我们就说a能被b整除,或b能整除a。a称为b的倍数,b称为a的约数。一个整数的约数是有限的。同时,它可以在特定情况下成为公约数。
同余
给定一个正整数m,如果两个整数a和b满足a-b能够被m整除, 即**(a-b)/m得到一个整数**,那么就称整数a与b对模m同余,记作a≡b(mod m)
e.g. 26≡2(mod 12) 即26%(k*12)=2 (k∈Z)
质数
质数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数。
互质
公约数只有1的两个整数
e.g. 8,10的最大公因数是2,不是1,因此不是整数互质
算法定理
威尔逊定理 Wilson
What
p是质数,等价于 (p-1)! ≡ -1 (mod p),即**(p-1)!%p=-1**
Code
bool Wilson(int x){
//fun函数为阶乘,略
return (fun(n-1)+1)%n==0
}
Use
判定质数
线性筛/欧拉筛法 get_primes
在介绍线性筛之前,还有一种筛素数的方法——埃拉托斯特尼筛法
具体请绕步洛谷P3383线性筛第一篇题解
What
任何一个合数都可以表示成一个质数和一个数的乘积。总之就是拿最小因数来筛质数,来达到每个数只筛一遍,时间复杂度为O(n)
Code
int N;//范围为1~N
int primes[10000005],cnt;//primes为素数表,cnt为素数个数
bool st[10000005];//是否被筛过
void get_primes(int n){
for(int i=2;i<=n;i++){
if(!st[i]) primes[cnt++]=i;//如果没被筛过,那么就是质数,加入素数表
for(int j=0;j<cnt&&i*primes[j]<=n;j++){//被筛的数没超出范围
st[primes[j]*i]=true;//被筛
}
}
}
Use
用来筛素数,一般用于预处理。但是,
只有msqrtn比n大的时候才用线性筛,否则速度是不如暴力的(m为要筛的个数,n为范围)
欧几里得算法/辗转相除法 Euclid 1.0
What/Use
用来求最大公约数
Code
int gcd(int a,int b){
return b?gcd(b,a%b):a;
}
扩展欧几里得算法 Euclid 2.0
What/Use
预备定理:裴蜀定理
若a,b是整数,且**(a,b)=d**,【a和b的最大公因数是d】那么对于任意的整数x,y,ax+by都一定是d的倍数,特别地,一定存在整数x,y,使ax+by=d成立
扩展欧几里得算法可以在 O(logn) 的时间复杂度内求出系数 x,y
Code
int exgcd(int a, int b, int &x, int &y){
if (!b){
x = 1; y = 0;
return a;
}
int d = exgcd(b, a % b, y, x);
y -= (a/b) * x;
return d;
}
快速幂
What
用分解的方法来求幂
e.g.先求21,22,24,28……∴21024=22*22*22……
Code
typedef long long LL;
int qmi(int a,int k,int p){
int res=1%p;
while(k){
if(k&1) res=(LL)res*a%p;
a=(LL)a*a%p;
k>>=1;
}
return res;
}
Use
同上
欧拉函数 Euler
What
1~N中与N互质的数的个数被称为欧拉函数,记为φ(N)
互质:如果gcd(a, b) = 1,则称a,b互质。【注意:a,b不一定都为质数,如4和7】
如果N = p1^c1 * … * pk^ck,则
φ(N) = N * (1 – 1/p1) * (1 – 1/p2) * … * (1 – 1/pk) ,
1~N中所有与N互质的数的和等于 N * φ(N) / 2
这样子看会清楚一点吧
上面一大堆看不懂是不是?我也看不懂哦
举个栗子
24
24=23+31
φ24=24*(2-1)/2*(3-1)/3=8
Code
#include<bits/stdc++.h>
using namespace std;
int n,num;
int main(){
scanf("%d",&n);
while(n--){
scanf("%d",&num);
int cnt=0,ans=num;
for(int i=2;i*i<=num;++i){
if(num%i==0){
ans=ans/i*(i-1);
while(num%i==0) num/=i;
}
}
if(num>1) ans=ans/num*(num-1);
printf("%d\n",ans);
}
return 0;
}
筛法求欧拉函数
What
给定一个正整数n,求1~n中每个数的欧拉函数之和。
Code
int primes[N],cnt;
int phi[N];
bool st[N];
long long get_eulers(int n){
phi[1]=1;
for(int i=2;i<=n;++i){
if(!st[i]){
primes[cnt++]=i;
phi[i]=i-1;
}
for(int j=0;primes[j]<=n/i;++j){
int p=primes[j];
st[p*i]=true;
if(i%p==0){
phi[p*i]=phi[i]*p;break;
}
phi[p*i]=phi[i]*(p-1);//p*i代表任意一个要筛的数
}
}
long long res=0;
for(int i=1;i<=n;++i) res+=phi[i];
return res;
}
Use
这里给出一道题:可见的点
欧拉定理
What
若正整数a, n互质,则a^φ(n) ≡ 1 (mod n),其中 φ(n) 为欧拉函数。
Code
#include<bits/stdc++.h>
using namespace std;
int n,num;
int main(){
scanf("%d",&n);
while(n--){
scanf("%d",&num);
int cnt=0,ans=num;
for(int i=2;i*i<=num;++i){
if(num%i==0){
ans=ans/i*(i-1);
while(num%i==0) num/=i;
}
}
if(num>1) ans=ans/num*(num-1);
printf("%d\n",ans);
}
return 0;
}
Use
求在1~n范围内与n互质的数的总数
费马小定理
What
若p是质数,则对于任意整数a,有a^p ≡ a(mod p),即a^p%p=a
▶
(a*x)%p=1 a是x的逆元,x是a的逆元
可以认为费马小定理就是欧拉定理的特殊情况
Code
快速幂求逆元
#include<bits/stdc++.h>
using namespace std;
int n;
int qmi(int a,int k,int p){
int res=1%p;
while(k){
if(k&1) res=(long long)res*a%p;
a=(long long)a*a%p;
k>>=1;
}
return res;
}
int main(){
scanf("%d",&n);
while(n--){
int a,p;scanf("%d%d",&a,&p);
if(a%p==0)
puts("impossible");
else
printf("%d\n",qmi(a,p-2,p));
}
return 0;
}
Use
求逆元
卢卡斯定理
What
Lucas(n,m)%p=Lucas(n/p,m/p)*C(n%p,m%p)%p
求上式的时候,Lucas递归出口为m=0时返回1
Code
typedef long long LL;
int p;
int qmi(int a,int k){
int res=1%p;
while(k){
if(k&1) res=(LL)res*a%p;
a=(LL)a*a%p;
k>>=1;
}
return res;
}
int C(int a,int b){
if(a<b) return 0;//不存在的组合数
int res=1;
for(int i=a,j=1;j<=b;i--,j++){
res=(LL)res*i%p;//这是组合数里一个什么公式emmm
res=(LL)res*qmi(j,p-2)%p;//乘法逆元
}
return res;
}
int lucas(LL a,LL b){
if(a<p&&b<p) return C(a,b);
return (LL)C(a%p,b%p)*lucas(a/p,b/p)%p;
}
Use
求组合数取模[n和m较大,但是p为素数的时候]
今天搬运过来看看都觉得头秃……高一的我好厉害啊这些都记下来了(悄悄自恋
[C++]请麻烦压一下定理的棺材板啦的更多相关文章
- [AFO·游记]我的C++451天游击战
写在前面 05/10/19 今天心情很糟糕,没学新东西,复习没复习,作业没写完,下午要网课,明天要月考,脑子里就像是被一团棉花塞住了.静静的思考了半个小时,把自己手头上的事情排了个序,所以决定先把游记 ...
- Python Locust对指定网站“一键压测”
[本文出自天外归云的博客园] 前篇 前篇:Python Locust性能测试框架实践 本篇 承上——归纳过程 在前篇的基础上,我们可以利用Locust性能测试框架编写python脚本对指定网站或者接口 ...
- USACO 3.4 Electric Fence 皮克定理
题意:在方格纸上画出一个三角形,求三角形里面包含的格点的数目 因为其中一条边就是X轴,一开始想的是算出两条边对应的数学函数,然后枚举x坐标值求解.但其实不用那么麻烦. 皮克定理:给定顶点坐标均是整点( ...
- Eva 剧情解析
Eva 剧情解析 来源 https://zhuanlan.zhihu.com/p/20864898 [0.写在前面的话] 相信和我年龄差不多的小伙伴们对<新世纪福音战士>( <Neo ...
- Key/Value之王Memcached初探:二、Memcached在.Net中的基本操作
一.Memcached ClientLib For .Net 首先,不得不说,许多语言都实现了连接Memcached的客户端,其中以Perl.PHP为主. 仅仅memcached网站上列出的语言就有: ...
- eclipse 高亮代码
本文整合自网络上的两种靠谱的使eclipse代码高亮的方式. 其实你可以在Window->proferences->java->editor->syndex coloring- ...
- WEKA使用(基础配置+垃圾邮件过滤+聚类分析+关联挖掘)
声明: 1)本文由我bitpeach原创撰写,转载时请注明出处,侵权必究. 2)本小实验工作环境为Windows系统下的WEKA,实验内容主要有三部分,第一是分类挖掘(垃圾邮件过滤),第二是聚类分析, ...
- 【转】 Key/Value之王Memcached初探:二、Memcached在.Net中的基本操作
一.Memcached ClientLib For .Net 首先,不得不说,许多语言都实现了连接Memcached的客户端,其中以Perl.PHP为主. 仅仅memcached网站上列出的语言就有: ...
- Key/Value之王Memcached初探:二、Memcached在.Net中的基本操作 - Edison Chou
一.Memcached ClientLib For .Net 首先,不得不说,许多语言都实现了连接Memcached的客户端,其中以Perl.PHP为主. 仅仅memcached网站上列出的语言就有: ...
随机推荐
- C语言Windows程序设计—— 使用计时器
传统意义上的计时器是指利用特定的原理来测量时间的装置, 在古代, 常用沙漏.点燃一炷香等方式进行粗略的计时, 在现代科技的带动下, 计时水平越来越高, 也越来越精确, 之所以需要进行计时是在很多情况下 ...
- UnitTest测试框架-操作步骤
一.UnitTest 1. TestCase 说明:测试用例 1.新建类并集成unittest.TestCase 2. TestSuite 说明:测试套件(多条用例) 方法: 1. 实例化 suite ...
- [洛谷P3366] [模板] 最小生成树
存个模板,顺便复习一下kruskal和prim. 题目传送门 kruskal 稀疏图上表现更优. 设点数为n,边数为m. 复杂度:O(mlogm). 先对所有边按照边权排序,初始化并查集的信息. 然后 ...
- mailx发邮件报错Error initializing NSS: Unknown error -8015. . . . message not sent.处理
前提:在配置zabbix3.0监控发送邮件告警时zabbix界面显示邮件以送达,但是QQ邮箱却没有收到邮件,再shell命令行测试发邮件QQ邮箱又是可以收到的,在别人的提醒下用zabbix用户执行发送 ...
- 全平台Markdown笔记软件——Notable
简介 The markdown-based note-taking app that doesn't suck. 一款简介.跨平台的本地笔记软件,github地址:https://github.com ...
- ES6中Map数据结构学习笔记
很多东西就是要细细的品读然后做点读书笔记,心理才会踏实- Javascript对象本质上就是键值对的集合(Hash结构),但是键只能是字符串,这有一定的限制. 1234 var d = {}var e ...
- 状态模式(State)-设计模式
软件模式是将模式的一般概念应用于软件开发领域,即软件开发的 总体指导思路或参照样板.软件模式并非仅限于设计模式,还包括 架构模式.分析模式和过程模式等,实际上,在软件生存期的每一个阶段都存在着一些被认 ...
- Centos 7 安装Mysql8 主从同步复制
环境:Centos 7 软件:Mysql8 安装方式:Yum 1.从官网下载最新yum 源对应Cenots 7 版本安装: [root@DataNode-03 ~]# yum -y localinst ...
- maven笔记--持续更新
笔记: 在创建maven项目的时候,如果用到servlet的时候,需要导入包,这时候,需要导入本地仓库的jar包,即依赖包.语法如下 <dependency> <groupId> ...
- Typescript 01 安装与使用
---恢复内容开始--- 一. 介绍 1. TypeScript 是由微软开发的一款开源的编程语言. 2. TypeScript 是 Javascript 的超级,遵循最新的 ES6.Es5 规范.T ...