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 6 Part 2.的更多相关文章

  1. 夏令营讲课内容整理 Day 7.

    Day7是夏令营的最后一天,这一天主要讲了骗分技巧和往年经典的一些NOIP试题以及比赛策略. 这天有个小插曲,上午的day7T3是一道和树有关的题,我是想破脑袋也想不出来,正解写不出来就写暴力吧,暴力 ...

  2. 夏令营讲课内容整理 Day 3.

    本日主要内容是树与图.   1.树 树的性质 树的遍历 树的LCA 树上前缀和   树的基本性质: 对于一棵有n个节点的树,必定有n-1条边.任意两个点之间的路径是唯一确定的.   回到题目上,如果题 ...

  3. 夏令营讲课内容整理Day 0.

    今年没有发纸质讲义是最气的.还好我留了点课件. 第一次用这个估计也不怎么会用,但尝试一下新事物总是好的. 前四天gty哥哥讲的内容和去年差不多,后三天zhn大佬讲的内容有点难,努力去理解吧. 毕竟知识 ...

  4. 夏令营讲课内容整理 Day 6 Part 3.

    第三部分主要讲的是倍增思想及其应用. 在Day3的整理中,我简要提到了倍增思想,我们来回顾一下. 倍增是根据已经得到的信息,将考虑的范围扩大一倍,从而加速操作的一种思想,它在变化规则相同的情况下,加速 ...

  5. 夏令营讲课内容整理 Day 6 Part 1.

    Day6讲了三个大部分的内容. 1.STL 2.初等数论 3.倍增   Part1主要与STL有关. 1.概述 STL的英文全名叫Standard Template Library,翻译成中文就叫标准 ...

  6. 夏令营讲课内容整理 Day 5.

    DP专场.. 动态规划是运筹学的一个分支, 求解决策过程最优化的数学方法. 我们一般把动态规划简称为DP(Dynamic Programming)   1.动态规划的背包问题 有一个容量为m的背包,有 ...

  7. 夏令营讲课内容整理 Day 4.

    本日主要内容就是搜索(打暴力 搜索可以说是OIer必会的算法,同时也是OI系列赛事常考的算法之一. 有很多的题目都可以通过暴力搜索拿到部分分,而在暴力搜索的基础上再加一些剪枝优化, 就有可能会拿到更多 ...

  8. 夏令营讲课内容整理 Day 2.

    本日主要内容是并查集和堆. 并查集 并查集是一种树型的数据结构,通常用来处理不同集合间的元素之间的合并与查找问题.一个并查集支持三个基本功能:合并.查找和判断.举一个通俗的例子,我和lhz认识,lhz ...

  9. 夏令营讲课内容整理Day 1.

    主要内容是栈和队列. 1.  栈 运算受到限制的线性表.只允许从一端进行插入和删除等操作.这一端便是栈顶,另一端便是栈底. 其实可以把栈想象层任何有底无盖的柱状的容器...毕竟栈满足后进先出的特性.计 ...

随机推荐

  1. 对于hive使用的一点记录

    最近一段时间因工作需要接触了一些hive上的使用!当然大部分都是比较基本的使用,仅当入门!各位看到有不足之处望多多指正! 废话不多说,开始: 首先是创建数据库 create database '数据库 ...

  2. 启动redis

    方法一:默认是前端启动       默认端口:6379 cd  /usr/local/redis/bin/redis-server 方法二:后端启动 方法二:后端启动 然后进入 指定配置文件 [roo ...

  3. iframe及与页面之间的通信

    获取iframe对象 iframe元素本身是位于父级页面中的,所以你可以像一个普通元素一样的使用和操作它 代表了iframe内容window对象是作为一个页面的属性加入到iframe中的, 为了让父级 ...

  4. webpack优化之code splitting

    作为当前风头正盛的打包工具,webpack风靡前端界.确实作为引领了一个时代的打包工具,很多方面都带来了颠覆性的改进,让我们更加的感受到自动化的快感.不过最为大家诟病的一点就是用起来太难了. 要想愉快 ...

  5. JAVA:成员变量和局部变量的区别

    1.作用于不同: 局部变量的作用域仅限于定义它的方法 成员变量的作用域在整个类的内部都是可见的 2.初始值不同 JAVA会给成员变量一个初始值 JAVA不会给局部变量赋予初始值 3.在同一个方法中,不 ...

  6. dig(域信息搜索器)命令

    dig命令   dig命令是常用的域名查询工具,可以用来测试域名系统工作是否正常. 语法 dig(选项)(参数) 选项 @<服务器地址>:指定进行域名解析的域名服务器: -b<ip地 ...

  7. 如何从Android工程导出apk安装包

    http://jingyan.baidu.com/article/1876c852b3208b890b137606.html

  8. Python 使用Pillow模块生成验证码

    1.安装 pip3 install pillow 2.使用步骤 生成验证码和验证字符串 绘制图片,将验证码放入session中 将图片返回给页面 3.代码demo #!/usr/bin/env pyt ...

  9. Springmvc 并发访问的线程安全性问题

    首先对于spring的IOC来说,对象是由Spring来帮我们管理,也就是在Spring启动的时候,在Spring容器中,由Spring给我们创建的,Spring会帮我们维护,一般都是单例的,也就是一 ...

  10. centos下配置sftp且限制用户访问目录[转]

    第一步:创建sftp服务用户组,创建sftp服务根目录 groupadd sftp #此目录及上级目录的所有者(owner)必须为root,权限不高于755,此目录的组最好设定为sftp mkdir ...