Day 6的第二部分,数论
数论是纯粹数学的分支之一,主要研究整数的性质
1.一些符号:
a mod b 代表a除以b得到的余数
a|b a是b的约数
floor(x) 代表x的下取整,即小于等于x的最大整数,也可以认为是直接舍去小数部分
(这个应该是一个符号,但我不知道怎么打出来。。下面那个ceil也是)
ceil(x) 代表x的上取整,即大于等于x的最小整数,也可以认为是直接舍去小数部分再+1.
gcd(a,b) 表示a与b的最大公约数
lcm(a,b) 表示a与b的最小公倍数
累加符号∑ 累乘符号∏
logab代表以a为底的b的对数,ln表示以e为底的对数,lg代表以10为底的对数
2.质数
也称素数,是质因子只有1和它本身的数。
与质数相对的是合数,合数在因数拆分时可以拆分成至少两对其他数的乘积。
特殊规定,1既不是质数也不是合数。
可以证明,素数是无限多个的,证明从略。
3.唯一分解定理
算术基本定理之一。
定理是这样描述的:对于每一个大于1的自然数都可以写成质数的积,而这些因子按照大小排列后,只有一种结果(写法只有一种)。
我并不会证。。。我太弱了
这个定理是分解质因数的基础。它告诉我们可以用质数乘积的形式处理一些大数字,处理一类和约数有关的问题。
显然,一个数n最多有一个大于√n的质因子。
4.筛法
用来快速求一个数是不是质数的算法
通常有两种筛法:埃氏筛和欧拉筛
4.1埃氏筛法
核心思想:从2到n枚举,当找到一个质数时,枚举它的所有倍数,这些倍数绝对不可能是质数。
int cnt;
int prime[maxn];
bool vis[maxn];
void Eratosthenes(int n){
for (int i=;i<=n;i++)
if (!vis[i]){
prime[++cnt] = i;
for (int j = i*;j<=n;j+=i)
vis[j] = ;
}
}
时间复杂度是O(nloglogn),证明从略。
4.2欧拉筛法
核心思想是通过让每一个数只会被它最小的质因子筛到,从而每个数只会被筛一次,时间复杂度O(n)。
对于任意一个合数,我们可以拆成最小质因子*某数i的形式,我们枚举这个数i,然后再枚举出所有筛的质数。
当我们枚举的质数可以整除i时,如果再往大里枚举,枚举的质数就不可能是最小质数了。这时就可以终止循环,继续枚举下一个i。
int cnt;
int prime[maxn];
bool vis[maxn];
void Eular(int n){
for (int i=;i<=n;i++){
if (!vis[i])
prime[++cnt] = i;
for (int j=;j<=cnt && prime[j]*i<=n;++j){
vis[prime[j]*i] = ;
if (i % prime[j] == )
break;
}
}
}
5.取模
我想您应该早已熟知余数的定义。
a % b(就是a mod b)得到的结果是a除以b得到的余数。
性质:a %b = a-(a/b)*b
一些题目要求对答案取模,如果这个答案是负的,应该加上模数而不是除。
取模的性质:
(a±b) % p = ((a % p) ± b) % p
(a*b) %p=(a % p) * (b % p)
6.最大公约数
辗转相除。
int gcd(int a, int b){
if (!b)
return a;
return gcd(b, a % b);
}
7.同余
这里引入一个新符号,a≡b(mod n)表示a与b在模n意义下的余数相同,称为a与b同余。
同余的性质:
1.反身性 a≡a (mod m)
2.对称性 若a≡b(mod m),则b≡a (mod m)
3.传递性 若a≡b (mod m),b≡c (mod m),则a≡c (mod m)
4.同余式相加 若a≡b (mod m),c≡d(mod m),则a+c≡b+d (mod m)(或换成-)
5.同余式相乘 若a≡b (mod m),c≡d(mod m),则ac≡bd (mod m)
7.1逆元
如果 ax≡1(mod n),那么x为a关于模n意义下的逆元。
逆元一般用inv简称。
当gcd(a,n) = 1时x为一唯一值,否则不存在,证明从略。
其实可以这么想,x为模n意义下的倒数,也就是1/a,我们可以类比实数意义下的倒数在模n意义下a乘以b的逆元,相当于模n意义下的a/b。
求逆元的方法,接下来讲。
8.扩展欧几里得算法
(借鉴了gty哥哥课件的思路)
简称扩欧,exgcd。
用来求解形似ax+by = gcd(a,b)一类方程的解。
这里的x和y不一定是正整数,有可能是负数或0.
比如说我举个例子,求一直线ax+by+c = 0上有多少个整数点(x,y)满足x∈[x1,x2],y∈[y1,y2]
边界情况:
当b=0时,gcd(a,b)=a,x=1,y=0
假设 ax1 + by1= gcd(a,b),bx2 + (a % b)y2= gcd(b,a % b)
由gcd的意义,知gcd(a,b) = gcd(b,a % b),那么有ax1 + by1 = bx2+ (a % b)y2;
也就是说ax1 + by1 = bx2 + (a - [a / b] * b)y2 = ay2 + bx2 - [a / b] * by2;
也就是说ax1 + by1 == ay2+ b(x2 - [a / b] *y2);
那么,x1 = y2; y1 = x2 - [a / b] * y2;
这样我们就得到了求解 x1,y1 的方法:x1,y1 的值基于 x2,y2。我们可以通过不断递归调用求解。
void exgcd(int a, int b, int &d, int &x, int &y){
if (!b) {
d = a;
x = ;
y = ;
}
else {
exgcd(b, a % b, d, y, x);
y -= (a / b) * x;
}
}
我们这样只能得出一组解,其他解呢?如果我们现在有解(x1,y1),任取另外一组解(x2,y2),则有ax1 + by1 = ax2 + by2 = gcd(a, b),变形可以得到a(x1 – x2) = b(y2 – y1),两边同时除以gcd(a, b),得到a’(x1 – x2) = b’(y2 – y1),因为(a’,b’)=1,所以(x1-x2)一定是b’的倍数,取x1-x2=kb’,得y2-y1=ka’。
所以我们有以下结论:
对方程ax+by+c=0,一组整数解为(x0,y0),则它的任意整数解可以写成(x0+kb’,y0-ka’),其中a’=a/gcd(a, b),b’=b/gcd(a, b)
关于ax+by=c有没有解,我们有这么一个结论:
对于方程ax+by=c(a,b,c均为整数),如果c为gcd(a,b)的倍数,则方程有整数解,反之无整数解。因为a和b都是gcd(a,b)的倍数,所以ax+by一定也是gcd(a,b)的倍数,如果c不是gcd(a,b)的倍数,一定无解。
那刚才那道题怎么做呢?
方程变形为ax+by = -c,看一下-c是不是gcd(a,b)的倍数,然后用exgcd求一下ax+by = gcd(a,b)的解,记为(x0,y0)。
等式两边同乘(-c)/gcd(a,b),就有ax0'+by0' = -c
用刚才的结论,求出使x = x0 + kb'落在区间[x1,x2]内的k的范围和使y = y0-ka'落在区间[y1,y2]内的k的范围,取交集就是答案。
9.费马小定理
如果p是质数,并且gcd(a,p) = 1,那么 a^(p-1) ≡ 1 (mod p)
由这个式子我们可以知道,a关于p的逆元就是a^(p-2) % p,用快速幂就好,证明从略。
10.快速幂
快速幂用了一个倍增的思想,我把它放在Part 3.
11.排列组合
11.1排列
排列数指的是从n个数中任取m个元素排成有顺序的一列,这一列称为一个排列,所有排列总数称为排列数。
生成排列数:DFS 或 next_permutation
从n个元素里取m个成为排列记为A(n,m) (原谅打不出来)
A(n,m) = n * (n-1) * (n-2) * (n-3) * ... * (n-m+1) = n!/(n-m)!
11.2组合
组合数指的是从n个数中任取m个 元素设为一组,叫做一个组合,这样所有的组合的数量就是组合数。
可以发现,排列要求元素带有顺序,而组合则不考虑顺序。
公式是C(n,m) = n * (n-1) * (n-2) * (n-3) * ... * (n-m+1)/m! = n!/m!(n-m)!
组合的性质:
C(n,m) = C(n-1,m-1) + C(n-1,m)
C(n,m) = C(n,n-m)
C(n,m) = C(n,m-1)*(n-m+1)/m (m>0)
由性质3可递推某一n确定下的组合数
其实排列组合这一块有很多内容,然而。。。
我觉得我讲得再多也没高中数学选修2-3讲得明白。。。。
所以,如果有没提到的地方,请参见高中数学选修2-3。。
- 夏令营讲课内容整理 Day 7.
Day7是夏令营的最后一天,这一天主要讲了骗分技巧和往年经典的一些NOIP试题以及比赛策略. 这天有个小插曲,上午的day7T3是一道和树有关的题,我是想破脑袋也想不出来,正解写不出来就写暴力吧,暴力 ...
- 夏令营讲课内容整理 Day 3.
本日主要内容是树与图. 1.树 树的性质 树的遍历 树的LCA 树上前缀和 树的基本性质: 对于一棵有n个节点的树,必定有n-1条边.任意两个点之间的路径是唯一确定的. 回到题目上,如果题 ...
- 夏令营讲课内容整理Day 0.
今年没有发纸质讲义是最气的.还好我留了点课件. 第一次用这个估计也不怎么会用,但尝试一下新事物总是好的. 前四天gty哥哥讲的内容和去年差不多,后三天zhn大佬讲的内容有点难,努力去理解吧. 毕竟知识 ...
- 夏令营讲课内容整理 Day 6 Part 3.
第三部分主要讲的是倍增思想及其应用. 在Day3的整理中,我简要提到了倍增思想,我们来回顾一下. 倍增是根据已经得到的信息,将考虑的范围扩大一倍,从而加速操作的一种思想,它在变化规则相同的情况下,加速 ...
- 夏令营讲课内容整理 Day 6 Part 1.
Day6讲了三个大部分的内容. 1.STL 2.初等数论 3.倍增 Part1主要与STL有关. 1.概述 STL的英文全名叫Standard Template Library,翻译成中文就叫标准 ...
- 夏令营讲课内容整理 Day 5.
DP专场.. 动态规划是运筹学的一个分支, 求解决策过程最优化的数学方法. 我们一般把动态规划简称为DP(Dynamic Programming) 1.动态规划的背包问题 有一个容量为m的背包,有 ...
- 夏令营讲课内容整理 Day 4.
本日主要内容就是搜索(打暴力 搜索可以说是OIer必会的算法,同时也是OI系列赛事常考的算法之一. 有很多的题目都可以通过暴力搜索拿到部分分,而在暴力搜索的基础上再加一些剪枝优化, 就有可能会拿到更多 ...
- 夏令营讲课内容整理 Day 2.
本日主要内容是并查集和堆. 并查集 并查集是一种树型的数据结构,通常用来处理不同集合间的元素之间的合并与查找问题.一个并查集支持三个基本功能:合并.查找和判断.举一个通俗的例子,我和lhz认识,lhz ...
- 夏令营讲课内容整理Day 1.
主要内容是栈和队列. 1. 栈 运算受到限制的线性表.只允许从一端进行插入和删除等操作.这一端便是栈顶,另一端便是栈底. 其实可以把栈想象层任何有底无盖的柱状的容器...毕竟栈满足后进先出的特性.计 ...
随机推荐
- SQL语句整理1
THEN '月卡' THEN '周卡' THEN '季度卡' THEN '年卡' ELSE '未知卡类型' END AS '卡类型' FROM SL_Register_Info Left join用法 ...
- Linux环境JDK安装
Java的编程离不开jdk,今天本文主要讲下Linux下的JDK安装与配置 1.卸载Linux自带的JDK #检测jdk安装包 [root@localhost ~]# rpm -qa | grep j ...
- 使用 video.js 开发 HTML5 视频页面
时间 2015-05-13 17:11:58 The GIS Guy 原文 http://thegisguy.tk/html5-video-using-video-js/ 主题 Video.js H ...
- url加密,一般只对参数加密
首先,很不推荐你使用get方式发送密码,最好是使用post. 原因是,你通过一个连接把用户名和密码发送到后台,即便密码不是明文,别人获取不到密码明文,但是,只要你这个连接成功登陆过,别人就可以拿这个连 ...
- MYSQL 数据库导入导出命令
在不同操作系统或MySQL版本情况下,直接拷贝文件的方法可能会有不兼容的情况发生.所以一般推荐用SQL脚本形式导入.下面分别介绍两种方法. MySQL命令行导出数据库 1,进入MySQL目录下的bin ...
- 基于FPGA的HDMI高清显示接口驱动
HDMI是(High Definition Multimedia Interface)的缩写,意思是高清晰度多媒体接口,是一种数字化视频/音频接口技术,适合影像传输的专用型数字化接口,可同时传送音频和 ...
- C#进行CAD二次开发环境配置
最近被公司分配到了做CAD二次开发.也是初次接触这方面的东西,其实是有些无从下手的感觉.因为公司这边也没有人有时间带我,只能是自己看书,然后再写一些Demo,再结合实际的应用来一点点的学习.废话不多说 ...
- 一篇文章帮你解决python的包管理
写python代码的人都知道,一个项目写下下来,不可避免的都需要使用很多第三方包,通常我们都是通过pip install ,然而当我们需要上线的时候问题来了,如果中间你自己不记得自己安装了多少个包,这 ...
- CCF系列之有趣的数(201312-4)
题目链接: http://115.28.138.223:81/view.page?opid=4 试题名称: 有趣的数 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 我们把一个 ...
- python-虎扑爬虫
Python作为一个高级编程语言,不知从何时起就在圈子里流行起来了.个人也是图个鲜,跟上时代步伐学习了一下."鲁迅"说过:不能学以致用,就是耍流氓.我用python对虎扑论坛作了一 ...