【基础总结】——数学知识

  • 最大公约数与最小公倍数
  • 算数唯一分解定理
  • 线性筛找素数(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−pi​1​)×piki​​=n×∏i=1r​(1−pi​1​)

这第五条性质简直太妙了,于是我们就可以用这个去求欧拉函数了(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))

  1. 通项公式:h(n)=1/(n+1)×C2nnh(n)=1/(n+1)\times C^n_{2n}h(n)=1/(n+1)×C2nn​
  2. 递推式子: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

简单来说看下图

行列式

性质

  1. 交换对应矩阵的 2 行(列),行列式取反
  2. 交换 1 行与 1 列(进行一次矩阵转置),行列式不变
  3. 行列式的行(列)所有元素等比例变化,则行列式也等比例变化
  4. 如果行列式对应矩阵 A 中有一行(列),是对应 2 个矩阵 B,C 中分别的 2 行(列)所有元素之和。那么有 A=B+C
  5. 如果一个矩阵存在两行(列)成比例则 A的值=0
  6. 把一个矩阵的一行(列)的值全部乘一个常数加到另一行(列)上,行列式值不变

求值

初始为∣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了

【基础总结】——数学知识相关推荐

  1. 3d数学基础:图形和游戏开发(第2版)_游戏引擎编程需要哪些基本数学知识?

    现今,想要从头写一个功能强大的3D引擎,个人的力量恐怕难以胜任,即使能力足够,时间恐怕也不允许.在这个美好的开源时代,你只需具备修改各种引擎的能力便足以满足开发游戏的各项需求.现代游戏引擎的复杂级别已 ...

  2. 游戏引擎编程需要哪些基本数学知识?

    现今,想要从头写一个功能强大的3D引擎,个人的力量恐怕难以胜任,即使能力足够,时间恐怕也不允许.在这个美好的开源时代,你只需具备修改各种引擎的能力便足以满足开发游戏的各项需求.现代游戏引擎的复杂级别已 ...

  3. 计算机专业应该掌握的数学知识

    http://blog.sina.com.cn/s/blog_6233611f0100m4vs.html 在校的计算机专业学生可能还没有体会到数学的重要性,还在忙于死记硬背各种公式应付考试.而已工作或 ...

  4. AcWing基础算法课Level-2 第四讲 数学知识

    AcWing基础算法课Level-2 第四讲 数学知识 您将学会以下数学名词 质数,试除法,埃式筛法,线性筛,辗转相除,算术基本定理,质因数分解,欧拉函数,快速幂,费马小定理,逆元,拓展欧几里得,一次 ...

  5. 【算法基础】 数学预备知识1——集合、关系和函数

    文章目录 一.集合 二.关系 1. 有序n元组 2. 笛卡尔积 3. 关系 (1) 关系的性质 (2) 等价关系 a. 等价类 b. 同余关系 三.函数 为什么要用到数学知识?很简单,一个算法通常把所 ...

  6. 虚幻引擎的数学知识学习教程 Math for Unreal Engine (Early Preview)

    通过做真实世界的 Unreal Engine项目来学习数学 你会学到什么 理解游戏开发对数学的基本需求 将数学直接应用到用例中,而不是钻研理论(用我们的示例项目进行实践) 正确编辑短视频,节省您的时间 ...

  7. 入门深度学习的必备数学知识

    作者:徐洲更 中科院在读遗传学博士.出于对计算机科学的兴趣,蜻蜓点水式自学了大量编程相关知识,现在对深度学习很感兴趣,正在恶补相关知识.此外,还负责帮忙管理生信媛,一个热衷于分享生物信息学知识的公众号 ...

  8. 一文掌握机器学习必备数学知识(附学习资源)

    来源:运筹OR帷幄 作者:留德华叫兽&王源 本文共5800字,建议阅读10分钟. 本文划分了ML数学基础的的初.中.高三个阶段并提供针对各阶段的学习资源. 0.前言 本篇文章是由留德华叫兽在知 ...

  9. 机器学习、深度学习所需掌握的数学知识全都在这里了!

    人工智能的基石是数学,没有数学基础科学的支持,人工智能很难行稳至远. -中国科学院院士.西安交通大学教授徐宗 [文末高薪招聘讲师!!!] 入行人工智能,所谓的门槛和挑战本质是你对数学知识的掌握程度. ...

  10. 人工智能的学习,需要学习哪些算法和数学知识呢?需要什么学历?

    https://www.toutiao.com/a6661754579887063566/ 根据<人工智能影响力报告>显示: 人工智能科学家主要毕业于清华大学.中国科学院.中国科技大学.麻 ...

最新文章

  1. 算法-------位1的个数
  2. python教材免费版-北大内部教材python版算法与数据结构PDF电子书免费下载
  3. 加了try的情况下线程中抛出未捕获的异常
  4. pxe装机dhcp获取不到_关于PXE服务器环境搭建流程中遇到的问题及解决方法
  5. arma模型_GARCH模型应用:以国泰君安为例
  6. 性质极其恶劣!针对基因编辑婴儿,怀进鹏这样说…
  7. mysqlbinlog工具_带你解析MySQL binlog
  8. 关于智能推荐的几点思考
  9. Spring Cloud Stream与RabbitMQ 消费者 消息分组
  10. 怎么做app图标_App拉新:以老拉新活动怎么做?
  11. 安全成Win10进军企业级市场的最大卖点?
  12. 零代码实现接口自动化测试-RF框架实践
  13. ddk开发 c语言,使用DDK提供的build进行编译驱动一点总结
  14. IE恶意修改防护大法(转)
  15. Navicat for Mysql永久激活方法
  16. 酷家乐前端开发工程师一面
  17. 利益相关者软件工程_吸引组织的各个利益相关者的4种方法
  18. icewm+rox-filer美化过程(转)
  19. GPT硬盘分区命令parted
  20. 动态加载Animator和AnimatorController

热门文章

  1. 心电信号质量评估——ecg_qc工具包使用方法
  2. 3d模型计算机教室,大学教室3d模型
  3. the specified jre installation does not exist 规定的jre没有安装
  4. deebot扫地机器人说明书_ecovacs扫地机器人730使用说明书_deebot扫地机器说明书
  5. iOS UDID与UUID
  6. 可视化常见绘图(四)柱状图
  7. 用计算机探索规律反思,规律的背后——用计算器探索规律教学反思
  8. python数字转英文_GitHub - Ailln/en2an: 快速转化「英文数字」和「阿拉伯数字」
  9. 【Bug解决】UnpicklingError: A load persistent id instruction was encountered, but no persistent_load.
  10. win10蓝牙已配对连接不上_win10蓝牙耳机连接不上怎么办_win10蓝牙耳机连接不上的解决方法...