【基础总结】——数学知识
【基础总结】——数学知识
- 最大公约数与最小公倍数
- 算数唯一分解定理
- 线性筛找素数(NNN)
- 扩展欧几里得
- 容斥原理
- 欧拉函数
- 定义:
- 性质:
- 逆元
- 欧拉定理
- 中国剩余定理
- 高斯消元(n3n^3n3)
- 线性基
- 卡特兰数(设为h(n))
- FWT
- 行列式
- 性质
- 求值
- 矩阵求逆
最大公约数与最小公倍数
理解起来挺简单的
重要等式:lcm[a,b]×gcd(a,b)=a×blcm[a,b]\times gcd(a,b)=a\times blcm[a,b]×gcd(a,b)=a×b
所以只要知道最大公约数就行。
int gcd(int a,int b)
{return b?gcd(b,a%b):a;
}
该代码运用了辗转相除法。因为(a,b)=(b,a模b)(a,b)=(b,a模b)(a,b)=(b,a模b),所以一直模模模模模模模模直到bbb为0,那么此时的最大公约数就是aaa,然后递归回去。
算数唯一分解定理
定义:任一大于1的整数n 能表示成质数的乘积
,且其分解的结果是唯一的[不考虑次序].
直接上代码理解
void fenjie(int n)
{js=0;for(int i=2;i*i<=n;i++){if(n%i==0) {js++,p[js]=i,c[js]=0;while(n%i==0) n/=i,c[js]++;}}if(n>1) js++,p[js]=n,c[js]=1;
}
ppp是底数,ccc是指数
1.找n的因数,只要它能除下这个数,就一直除除除除除除除,直到除除不下,别忘了指数也要++。
2.这样一直循环,直到找完了n的所有因子,但是n可能是个质数,所以如果一直没有找到它的因子,那么他就只能分成n1n^1n1了
线性筛找素数(NNN)
用腻了之前简单的试除法,来看看这个线性筛吧
for(int i=2;i<=n;i++)
{if(f[i]==0) f[i]=i,ans[++cnt]=i; for(int j=1;j<=cnt;j++){if(ans[j]>f[i]||ans[j]>n/i) break;f[i*ans[j]]=ans[j];}
}
f[i]f[i]f[i]记录的是iii的最小质因子
,而ans[i]ans[i]ans[i]记录的是目前找到的质数
1.线性筛其实是基于埃氏筛的,所以简单说一下。之前我们找素数是每个都判断,但是一个数的倍数一定不是质数,所以埃氏筛在找到一个质数的时候了,把这些质数的倍数都标记了。
2.但是聪明的某某发现,这样子会有大量重复标记,比如30会被2,3,5,标记,所以他想到用一个数的最小质因子来标记
,这样每个数就只被标记了一次。
3.可以来简单证明一下,如果不用最小质因子标记,那么30可能会被3×103\times 103×10标记,但是10能分成2×52\times 52×5,所以此时30一定被标记了两次。
4.对应代码倒数第二行,当质数表里的数大于了这个数的最小质因子,那么就breakbreakbreak,并且,如果这个数标记的数超过nnn了,也不用管了.
扩展欧几里得
裴蜀定理:
ax+by=cax+by=cax+by=c方程有解时当且仅当ccc时gcd(a,b)gcd(a,b)gcd(a,b)的倍数(若a,ba,ba,b互素,则ax+by=1ax+by=1ax+by=1有解)
欧几里得算法的核心是把(a,b)(a,b)(a,b)辗转为(b,a%b)(b,a \%b)(b,a%b),假设(b,a%b)(b,a\%b)(b,a%b)存在对应的(x1,y1)(x1,y1)(x1,y1)使得b×x1+(a%b)×y1=cb\times x1+(a\%b)\times y1=cb×x1+(a%b)×y1=c
根据:ax+by=b×x1+(a%b)×y1=b×x1+(a−[a/b]×b)×y1=a×y1+b×(x1−[a/b]×y1)ax+by=b\times x1+(a\%b)\times y1=b\times x1+(a-[a/b]\times b)\times y1=a\times y1+b\times (x1-[a/b]\times y1)ax+by=b×x1+(a%b)×y1=b×x1+(a−[a/b]×b)×y1=a×y1+b×(x1−[a/b]×y1)
得x=y1,y=x1−[a/b]×y1x=y1,y=x1-[a/b]\times y1x=y1,y=x1−[a/b]×y1
所以,基于这样的操作,我们的递归代码就产生了~
int work(int a,int b,int &x,int &y)
{if(b==0) {x=1,y=0;return a;}int d=work(b,a%b,x,y);int z=x;x=y,y=z-a/b*y;return d;
}
此时的x,yx,yx,y就是该方程的一组特解
了。
有了特解,我们就可以求通解了。
该公式为:x=x0×(c/d)+k×(b/d),y=y0×(c/d)−k×(a/d)x=x_0\times (c/d)+k\times (b/d),y=y_0\times (c/d)-k\times (a/d)x=x0×(c/d)+k×(b/d),y=y0×(c/d)−k×(a/d)
注意这里符号是一加一减
,具体证明…你不需要知道【滑稽】其实是我不会
经典例题:
天平称重
容斥原理
这个和数学鲍姐讲的一样,不多说了,感觉这道题的思想很像容斥 codeforces,C题
欧拉函数
定义:
对正整数n,欧拉函数是小于或等于n的数中与n互质的数的数目。
性质:
(1)φ(1)=1φ(1)=1φ(1)=1
(2)φ(p)=p−1φ(p)=p-1φ(p)=p−1
(3)φ(pk)=pk−pk−1=(p−1)pk−1φ(p^k)=p^k-p^{k-1}=(p-1)p^{k-1}φ(pk)=pk−pk−1=(p−1)pk−1
(4)欧拉函数是积性函数——若m,n互质,则φ(mn)=φ(m)φ(n)φ(mn)=φ(m)φ(n)φ(mn)=φ(m)φ(n)。(若函数是完全积性函数,则不需要互质条件)
(5)对于任意 n=p1k1×p2k2×...×prkrn=p_1^{k_1}\times p_2^{k_2}\times ...\times p_r^{k_r}n=p1k1×p2k2×...×prkr (其中 p1,p2,...,pkp_1,p_2,...,p_kp1,p2,...,pk 为 nnn 的互不相同的质因子) 则有 φ(n)=∏i=1rφ(piki)=∏i=1r(pi−1)piki−1=∏i=1r(1−1pi)×piki=n×∏i=1r(1−1pi)\varphi(n)=\prod_{i=1}^{r}\varphi(p_i^{k_i})=\prod_{i=1}^{r}(p_i-1)p_i^{k_i-1}=\prod_{i=1}^{r}(1-\frac 1{p_i})\times p_i^{k_i}=n\times \prod_{i=1}^{r}(1-\frac 1{p_i})φ(n)=∏i=1rφ(piki)=∏i=1r(pi−1)piki−1=∏i=1r(1−pi1)×piki=n×∏i=1r(1−pi1)
这第五条性质简直太妙了,于是我们就可以用这个去求欧拉函数了(N\sqrt NN)
long long oula(int x)
{ans=x;for(int i=2;i<=sqrt(x);i++){if(x%i==0) {ans=ans/i*(i-1);//这里用到了while(x%i==0) x/=i;}}if(x>1) ans=ans/x*(x-1);//防止n为质数return ans;
}
这个模板有没有很眼熟?没错,和埃氏筛很像,也就是说可以边筛素数边求欧拉函数,双倍的快乐【滑稽】
当然,更快的还是线性筛(NNN)
void oula(int x)
{for(int i=2;i<=x;i++){if(!f[i]) p[++cnt]=i,F[i]=i-1;for(int j=1;j<=cnt&&i*p[j]<=x;j++){ f[i*p[j]]=1;if(i%p[j]==0) {F[i*p[j]]=F[i]*(p[j]);break;}else F[i*p[j]]=F[i]*(p[j]-1);}}
}
这样就成功起飞了【芜湖】
逆元
定义什么的只可意会不可言传,主要用法就是在除一个数的时候,要求取模,那么就可以用$\times $他的逆元来代替。
对于逆元的求解方法才是我们应该掌握的
1.拓展欧几里得(适用于a,b互质的情况下,代码太麻烦,不常用)
依然是上面给出的代码,xxx即为所求的逆元
2.费马小定理(好写,不出错,logNlogNlogN)ap−1≡1(%p)a^{p-1}\equiv 1(\%p)ap−1≡1(%p)
同时/a/a/a就能得到ap−2≡a−1(%p)a^{p-2}\equiv a^{-1}(\%p)ap−2≡a−1(%p)
这样通过快速幂就能求出逆元了(大爱这种方法,但是多次询问时可能超时)
欧拉定理
若n,a为正整数,且n,a互质,即gcd(n,a)=1,则aφ(n)≡1(%p)a^{φ(n)}\equiv 1(\%p)aφ(n)≡1(%p)
可以看出,费马小定理是欧拉函数的一种特殊情况
一些比较恶心的推论:
ab≡ab%φ(n)%na^b\equiv a^{b\%φ(n)} \%nab≡ab%φ(n)%n
a,na,na,n不一定互质时,ab≡ab%φ(n)(%n)a^b\equiv a^{b\%φ(n)} (\%n)ab≡ab%φ(n)(%n)
中国剩余定理
韩信点兵大家都知道,这个就是解决类似的问题,只不过更快【滑稽】,但是也更麻烦。
【例题】存在一个数x,除以3余2,除以5余3,除以7余2,然后求这个数
首先假如我们求出这样三个数k1,k2,k3,满足k1与3互质且是5和7的倍数,k2与5互质且是3和7的倍数,k3与7互质且是3和5的倍数,那么容易意会得到,k1×2+k2×3+k3×2k1\times 2+k2\times 3+k3\times 2k1×2+k2×3+k3×2一定会是一个满足题
目条件的数。而题目的通解可表示为这个数每次都加上3,5,7的最小公倍数
首先我们求出3,5,7的lcm=105
然后我们令:
x1=105/3=35x1=105/3=35x1=105/3=35, x2=105/5=21x2=105/5=21x2=105/5=21, x3=105/7=15x3=105/7=15x3=105/7=15
然后我们求解以下方程: ((a×x1)(a\times x_1)(a×x1)就是k1k_1k1)
a×x1%3=1a\times x1\%3=1a×x1%3=1, b×x2%5=1b\times x2\%5=1b×x2%5=1, c×x3%7=1c\times x3\%7=1c×x3%7=1
这个格式的式子好眼熟,用扩展欧几里德求a=2,b=1,c=1。
答案就是:
ans=(a×x1×2+b×x2×3+c×x3×2)%lcm=23ans=(a\times x1\times 2+b\times x2\times 3+c\times x3\times 2)\%lcm=23ans=(a×x1×2+b×x2×3+c×x3×2)%lcm=23
通过以上例题,我们可以总结出求解的基本步骤
1.求出除数的乘积(不是最小公倍数没关系,这样方便)
2.循环,每次用公倍数除以除数,把得到的数当做aaa,将除数当做bbb
3.运用扩展欧几里得求解出x,ansansans加上a×x×余数a\times x\times 余数a×x×余数,然后再模公倍数
那么来看看代码吧
for(int i=1;i<=n;i++)
{long long x,y;long long aa=sum/a[i];ojld(aa,a[i],x,y);ans=(x*aa%sum*b[i]%sum+ans)%sum;
}
高斯消元(n3n^3n3)
上三角五步走:
int t=r;
for(int i=r;i<=n;i++) if(fabs(a[i][c])>fabs(a[t][c])) t=i;//找当前这一列绝对值最大的数
if(fabs(a[t][c])<py) continue;//如果这列全是零了,就不管
for(int i=c;i<=n+1;i++) swap(a[t][i],a[r][i]);//把他换到没被锁定的第一行
for(int i=n+1;i>=c;i--) a[r][i]/=a[r][c];//把这个数变成1,为了维护等式这一行都要除这个数
for(int i=r+1;i<=n;i++) if(fabs(a[i][c])>py) for(int j=n+1;j>=c;j--) a[i][j]-=a[r][j]*a[i][c];
//把每行的第c个数都消为0
//第二层循环倒着写,因为如果先把第一个变成0了,那后面的运算都要依靠第一个值,会出错
r++;
线性基
简单来说是一些数的集合,而这些数通过异或可以构成的数都不在这个集合中。毕竟是“基”,基础嘛,肯定是最最最最最下面的东西,没有更小的了,也就是没有数通过变换能构成他们
有关更详细 的介绍和一些经典代码的写法,参见
点我点我(作者:Hypoc_)
卡特兰数(设为h(n))
- 通项公式:h(n)=1/(n+1)×C2nnh(n)=1/(n+1)\times C^n_{2n}h(n)=1/(n+1)×C2nn
- 递推式子:h(n+1)=(4n+2)/(n+2)×h(n)h(n+1)=(4n+2)/(n+2)\times h(n)h(n+1)=(4n+2)/(n+2)×h(n)
FWT
简单来说看下图
行列式
性质
- 交换对应矩阵的 2 行(列),行列式取反
- 交换 1 行与 1 列(进行一次矩阵转置),行列式不变
- 行列式的行(列)所有元素等比例变化,则行列式也等比例变化
- 如果行列式对应矩阵 A 中有一行(列),是对应 2 个矩阵 B,C 中分别的 2 行(列)所有元素之和。那么有 A=B+C
- 如果一个矩阵存在两行(列)成比例则 A的值=0
- 把一个矩阵的一行(列)的值全部乘一个常数加到另一行(列)上,行列式值不变
求值
初始为∣25∣|\frac{2}{5}|∣52∣
使第二行除以(5/2)∣21∣|\frac{2}{1}|∣12∣
交换这两行 ∣12∣|\frac{1}{2}|∣21∣
第二行减第一行的两倍∣10∣|\frac{1}{0}|∣01∣
交换 ∣01∣|\frac{0}{1}|∣10∣
一直做下去就好啦
int work()
{int w=1;for(int i=1;i<=n;i++){for(int j=i+1;j<=n;j++){while(a[i][i]){int tmp=a[j][i]/a[i][i];for(int k=i;k<=n;k++) a[j][k]=((a[j][k]-1ll*tmp*a[i][k])%p+p)%p;swap(a[i],a[j]),w=-w;}swap(a[i],a[j]),w=-w;} }for(int i=1;i<=n;i++) w=1ll*w*a[i][i]%p;return (w%p+p)%p;
}
矩阵求逆
我们现在要求AAA的逆矩阵A−1A^{-1}A−1
设EEE为单位矩阵,也就是对角线上的数都是1,其他是0
那么根据定义A×A−1=E,E×A−1=A−1A\times A^{-1}=E,E\times A^{-1}=A^{-1}A×A−1=E,E×A−1=A−1
所以我们将AAA变成EEE的过程中,对另一个EEE也做同样的操作(这两个EEE肯定不同呀),于是后面的那个EEE就被我们变成A−1A^{-1}A−1了
【基础总结】——数学知识相关推荐
- 3d数学基础:图形和游戏开发(第2版)_游戏引擎编程需要哪些基本数学知识?
现今,想要从头写一个功能强大的3D引擎,个人的力量恐怕难以胜任,即使能力足够,时间恐怕也不允许.在这个美好的开源时代,你只需具备修改各种引擎的能力便足以满足开发游戏的各项需求.现代游戏引擎的复杂级别已 ...
- 游戏引擎编程需要哪些基本数学知识?
现今,想要从头写一个功能强大的3D引擎,个人的力量恐怕难以胜任,即使能力足够,时间恐怕也不允许.在这个美好的开源时代,你只需具备修改各种引擎的能力便足以满足开发游戏的各项需求.现代游戏引擎的复杂级别已 ...
- 计算机专业应该掌握的数学知识
http://blog.sina.com.cn/s/blog_6233611f0100m4vs.html 在校的计算机专业学生可能还没有体会到数学的重要性,还在忙于死记硬背各种公式应付考试.而已工作或 ...
- AcWing基础算法课Level-2 第四讲 数学知识
AcWing基础算法课Level-2 第四讲 数学知识 您将学会以下数学名词 质数,试除法,埃式筛法,线性筛,辗转相除,算术基本定理,质因数分解,欧拉函数,快速幂,费马小定理,逆元,拓展欧几里得,一次 ...
- 【算法基础】 数学预备知识1——集合、关系和函数
文章目录 一.集合 二.关系 1. 有序n元组 2. 笛卡尔积 3. 关系 (1) 关系的性质 (2) 等价关系 a. 等价类 b. 同余关系 三.函数 为什么要用到数学知识?很简单,一个算法通常把所 ...
- 虚幻引擎的数学知识学习教程 Math for Unreal Engine (Early Preview)
通过做真实世界的 Unreal Engine项目来学习数学 你会学到什么 理解游戏开发对数学的基本需求 将数学直接应用到用例中,而不是钻研理论(用我们的示例项目进行实践) 正确编辑短视频,节省您的时间 ...
- 入门深度学习的必备数学知识
作者:徐洲更 中科院在读遗传学博士.出于对计算机科学的兴趣,蜻蜓点水式自学了大量编程相关知识,现在对深度学习很感兴趣,正在恶补相关知识.此外,还负责帮忙管理生信媛,一个热衷于分享生物信息学知识的公众号 ...
- 一文掌握机器学习必备数学知识(附学习资源)
来源:运筹OR帷幄 作者:留德华叫兽&王源 本文共5800字,建议阅读10分钟. 本文划分了ML数学基础的的初.中.高三个阶段并提供针对各阶段的学习资源. 0.前言 本篇文章是由留德华叫兽在知 ...
- 机器学习、深度学习所需掌握的数学知识全都在这里了!
人工智能的基石是数学,没有数学基础科学的支持,人工智能很难行稳至远. -中国科学院院士.西安交通大学教授徐宗 [文末高薪招聘讲师!!!] 入行人工智能,所谓的门槛和挑战本质是你对数学知识的掌握程度. ...
- 人工智能的学习,需要学习哪些算法和数学知识呢?需要什么学历?
https://www.toutiao.com/a6661754579887063566/ 根据<人工智能影响力报告>显示: 人工智能科学家主要毕业于清华大学.中国科学院.中国科技大学.麻 ...
最新文章
- 算法-------位1的个数
- python教材免费版-北大内部教材python版算法与数据结构PDF电子书免费下载
- 加了try的情况下线程中抛出未捕获的异常
- pxe装机dhcp获取不到_关于PXE服务器环境搭建流程中遇到的问题及解决方法
- arma模型_GARCH模型应用:以国泰君安为例
- 性质极其恶劣!针对基因编辑婴儿,怀进鹏这样说…
- mysqlbinlog工具_带你解析MySQL binlog
- 关于智能推荐的几点思考
- Spring Cloud Stream与RabbitMQ 消费者 消息分组
- 怎么做app图标_App拉新:以老拉新活动怎么做?
- 安全成Win10进军企业级市场的最大卖点?
- 零代码实现接口自动化测试-RF框架实践
- ddk开发 c语言,使用DDK提供的build进行编译驱动一点总结
- IE恶意修改防护大法(转)
- Navicat for Mysql永久激活方法
- 酷家乐前端开发工程师一面
- 利益相关者软件工程_吸引组织的各个利益相关者的4种方法
- icewm+rox-filer美化过程(转)
- GPT硬盘分区命令parted
- 动态加载Animator和AnimatorController
热门文章
- 心电信号质量评估——ecg_qc工具包使用方法
- 3d模型计算机教室,大学教室3d模型
- the specified jre installation does not exist 规定的jre没有安装
- deebot扫地机器人说明书_ecovacs扫地机器人730使用说明书_deebot扫地机器说明书
- iOS UDID与UUID
- 可视化常见绘图(四)柱状图
- 用计算机探索规律反思,规律的背后——用计算器探索规律教学反思
- python数字转英文_GitHub - Ailln/en2an: 快速转化「英文数字」和「阿拉伯数字」
- 【Bug解决】UnpicklingError: A load persistent id instruction was encountered, but no persistent_load.
- win10蓝牙已配对连接不上_win10蓝牙耳机连接不上怎么办_win10蓝牙耳机连接不上的解决方法...