【技巧总结】——数学知识
数学知识
- 亿些公式
- 约数
- 约数个数
- 约数和
- 网格图3点共线(n*m)
- 威尔逊定理
- 高精
- 线性求逆元
- 线性基
- 插入
- 求最大值
- 求最小值
- 求第k小的数
- 求某个数的排名是第几小
- 撤销
- 矩阵乘法
- 加速起飞
- 模型思想
- 高斯消元( n 3 n^3 n3)
- 异或类问题
- 期望
- dp
- 莫比乌斯反演
- 技巧
- 例题
- 卷积
- 高维前缀和
亿些公式
用到什么就记什么吧
默认 n < m n<m n<m
- ∑ i = 1 n i 2 = n ( n + 1 ) ( 2 n + 1 ) 6 \sum_{i=1}^n\;i^2=\frac{n(n+1)(2n+1)}{6} ∑i=1ni2=6n(n+1)(2n+1)
- 已知 f ( n ) = ∑ d ∣ n g ( d ) f(n)=\sum_{d|n}g(d) f(n)=∑d∣ng(d),则 g ( n ) = ∑ d ∣ n f ( d ) μ ( n d ) g(n)=\sum_{d|n}f(d)\mu(\frac{n}{d}) g(n)=∑d∣nf(d)μ(dn)
- ( f × g ) ( n ) = ∑ d ∣ n f ( d ) × g ( n d ) (f\times g)(n)=\sum_{d|n}f(d)\times g(\frac{n}{d}) (f×g)(n)=∑d∣nf(d)×g(dn)
- 杜教筛: g ( 1 ) S ( n ) = ∑ i = 1 n ∑ d ∣ n f ( d ) g ( n d ) − ∑ i = 2 n g ( i ) S ( n i ) g(1)S(n)=\sum_{i=1}^n\sum_{d|n}f(d)g(\frac{n}{d})-\sum_{i=2}^ng(i)S(\frac{n}{i}) g(1)S(n)=∑i=1n∑d∣nf(d)g(dn)−∑i=2ng(i)S(in)
- ∑ i = 1 n ∑ j = 1 m [ g c d ( i , j ) = 1 ] = ∑ d = 1 n μ ( d ) ⌊ n d ⌋ ⌊ m d ⌋ \sum_{i=1}^n\sum_{j=1}^m[gcd(i,j)=1]=\sum_{d=1}^n\mu(d)\lfloor \frac{n}{d} \rfloor\lfloor \frac{m}{d} \rfloor ∑i=1n∑j=1m[gcd(i,j)=1]=∑d=1nμ(d)⌊dn⌋⌊dm⌋
- ∑ i = 1 n i [ g c d ( i , n ) = 1 ] = n × ϕ ( n ) 2 \sum_{i=1}^ni[gcd(i,n)=1]=\frac{n\times\phi(n)}{2} ∑i=1ni[gcd(i,n)=1]=2n×ϕ(n)
(因为gcd(x,n)=1时gcd(n,n-x)=1,所以一定存在一对与n互质的数加起来为n,这样的对数共有 ϕ ( n ) 2 \frac{\phi(n)}{2} 2ϕ(n)个)
约数
约数个数
首先先把x用唯一分解定理分解,变成 p 1 c 1 × p 2 c 2 . . . . . . p_1^{c_1}\times p_2^{c_2}...... p1c1×p2c2......
那么对于每一个质数,我们都有(c+1)种选择(选0个,1个,2个,……c个),用乘法原理可以得到,x的因子个数就是: ( c 1 + 1 ) × ( c 2 + 1 ) . . . . . . (c_1+1)\times(c_2+1)...... (c1+1)×(c2+1)......
约数和
思维同上,再加上乘法分配律把相同的项都提出来,就成了
( 1 + p 1 1 + p 1 2 . . . . . . + p 1 c 1 ) × ( 1 + p 2 1 + p 2 2 . . . . . . + p 2 c 2 ) . . . . . . (1+p_1^1+p_1^2......+p_1^{c_1})\times (1+p_2^1+p_2^2......+p_2^{c_2}) ...... (1+p11+p12......+p1c1)×(1+p21+p22......+p2c2)......
网格图3点共线(n*m)
- 水平共线: C m + 1 3 × ( n + 1 ) C^3_{m+1}\times(n+1) Cm+13×(n+1)
- 竖直共线: C n + 1 3 × ( m + 1 ) C^3_{n+1}\times(m+1) Cn+13×(m+1)
- 倾斜共线(因为左右对称,所以只计算一边,然后结果乘2 即可)
利用相似三角形的性质可知:设一个格点直角三角形两边长为 a , b a,b a,b,则它的两个端点的连线经过的格点个数为: g c d ( a , b ) − 1 gcd(a,b)-1 gcd(a,b)−1
则公式为: ∑ i = 1 i = n ∑ j = 1 j = m ( n − i + 1 ) ∗ ( m − j + 1 ) ∗ ( g c d ( i , j ) − 1 ) \sum^{i=n}_{i=1}\sum^{j=m}_{j=1}(n-i+1)*(m-j+1)*(gcd(i,j)-1) ∑i=1i=n∑j=1j=m(n−i+1)∗(m−j+1)∗(gcd(i,j)−1)
经典例题:
数三角形
威尔逊定理
( n − 1 ) ! % n (n-1)!\%n (n−1)!%n 当且仅当 n n n为质数的时候答案为 n − 1 n-1 n−1,其他时候都为0(表示不知道有什么用)
注意当 n = 4 n=4 n=4的时候答案为2
高精
- 杨辉三角+高精加
这个一眼就看出来了,单纯的套用,不多说,复杂度太高(不建议) - 唯一分解+高精乘
众所周知,组合数是一个整数
啊!!!!
所以,它下面的每一个因子,一定可以被上面的约掉
于是我们就可以把每个因子分解出来,然后加加减减,只留下约完的因子,再一波高精乘,完美结束
乘的时候完美可以采用1e9进制【你没听错】,也就是把一个 i n t int int数组直接存满,输出的时候如果要输出前导零,可以直接这样
printf("%09d",ans);//补齐9位,也就是如果是个7位数,那么会输出2个前导零
在因子加减的时候,可以直接传入1,-1来控制,超级巧妙
代码如下:
void fen(int x,int y)
{for(int i=2;i<=sqrt(x)&&x!=1;i++) while(x%i==0) c[i]+=y,x/=i;if(x) c[x]+=y;
}
//调用 C(g-1,k-1)
for(int i=1;i<=g-1;i++) fen(i,1);
for(int i=1;i<=k-1;i++) fen(i,-1);
for(int i=1;i<=g-k;i++) fen(i,-1);
经典例题:
方程的解
火车进出站
线性求逆元
这个直接粘代码吧,证明什么的真的太为难我了啊
//原数的逆元
ny[0]=1,ny[1]=1;
for(int i=2;i<=n;i++) ny[i]=(1ll*(p-p/i)*ny[p%i]%p)%p;//阶乘的逆元
ny[n]=ksm(jiec[n],p-2);
for(int i=n;i>=1;i--) ny[i-1]=1ll*ny[i]*i%p;
ny[0]=1;
线性基
线性基中的元素都无法被其他元素用异或操作表示,主要有以下几个操作:
插入
插入的时候,从高到低,如果这一位有值了,就异或掉,保证每一位只有一个元素,但是此时会出现 10011,00010的情况(也就是某一位线性基有值的时候,前面的元素的这一位可能也是1)
求最大值
从高位到低位,只要异或这个线性基能让结果变大就异或。
经典例题:
X O R XOR XOR(找无向图上,可重复边,1-n的路径上的权值异或和最大)
求最小值
如果这个数能被线性基表示,就是0,否则是最小的线性基
求第k小的数
这里就要求把线性基变成最简的,也就是把上面的例子变成10001,00010,然后对k二进制拆分,把是1的位置上的线性基异或起来就行
经典例题:
X O R XOR XOR(找第k小的异或和)
求某个数的排名是第几小
分为重复和不重复两种。如果不重复,那么就是求第k大反过来,找出它在线性基中异或了哪些数,对应的还原排名的二进制。如果重复,那么有些数不能插入,说明这些数和线性基中的一些数异或起来是个0,也就是在前面不重复的基础上添了一堆0.我们只需要求出这样0的个数,再加上那个排名,就是重复情况下的排名了。可以想象,线性基外的数随便选,肯定能异或出来0,而这样的选择共有2^(n-|B|)个
经典例题:
albus就是要第一个出场
撤销
并不是真的可撤销,而是添加了一个插入时间,在ask的时候判断一下是否符合时间限制就行了
根据操作不同,时间的修改方式也不同
比如要找异或最大值,那么让最高位越晚删除越好,如果之后插入的这一位也为1,那么我就把这个插进去,把原来的拿出来,也就是swap一下
经典例题:
八纵八横
白云的问题 (从前到后枚举右端点,然后就是这个的板子)
矩阵乘法
感觉是一个只可意会的算法,前面的基础例题确实非常基础,让你能看出来是矩阵乘法,后面的进阶也确实非常进阶,让你完全看不出来需要矩乘优化o(╥﹏╥)o
有一点需要提醒,这个算法是个比较良心的,乘法的循环与顺序无关
加速起飞
多用于图论加速,想一想邻接矩阵存边是不是矩阵,所以可以类比到矩阵乘法,解决这类问题:
从 x x x到 y y y,共走 k k kk kk步,一共有多少种方案?
这里直接建立原邻接矩阵为 A A A,那么答案就是 A k k . a [ x ] [ y ] A^{kk}.a[x][y] Akk.a[x][y](比较习惯用结构体存)
为什么这样?原因很简单:
刚开始矩阵中的数都为1,表示从 x x x到 y y y走1步的方案数为1
做矩阵乘法的核心代码是: Z . a [ i ] [ j ] + = X . a [ i ] [ k ] × Y . a [ k ] [ j ] Z.a[i][j]+=X.a[i][k]\times Y.a[k][j] Z.a[i][j]+=X.a[i][k]×Y.a[k][j]
可以理解为: i i i到 j j j的方案数=从 i i i到 k k k的方案数 × \times ×从 k k k到 j j j的方案数(分步,乘法原理)
以此类推,就能理解啦
经典例题:
HH散步(加了一丢丢限制条件)
毕竟是主要服务于图论,它还可以加速dp(它好像也是主要用于加速dp)
依然是要建立矩阵,一般都把答案存到最前面那一行
哦!好像就是斐波那契(滑稽)
经典例题:
斐波那契(最基础的题目啦,才发现好像真的是优化dp,看来之前真的没学懂)
棋盘(优化状压,真毒瘤啊o(╥﹏╥)o)
模型思想
具体模型可以看做有一件事情需要重复进行运算,尤其是这个重复计算的次数非常庞大,1e9!!,那么就要考虑一下矩乘了(找规律有时候也行)
而矩乘时的核心式子也是按照题目不同而定的不一定是乘法,而是与矩乘一样,·具有结合律的重复操作
经典例题:
晨练(重复的取反操作,要联想到矩乘)
高斯消元( n 3 n^3 n3)
异或类问题
一般来说,高斯消元是解决加减问题,但是^,又被称之为不进位的加法,所以只需要换一个符号,就能解决异或类问题,五个步骤依然同上
经典例题:
高斯消元解异或线性方程组(板子)
开关问题(求方案数,那么如果有一行是0=0,那么方案数翻倍)
期望
dp
一定要记好这个式子:
E ( a X + b Y ) = a E ( X ) + b E ( Y ) E(aX+bY)=aE(X)+bE(Y) E(aX+bY)=aE(X)+bE(Y)
这里的 a X , b Y aX,bY aX,bY 也可以是个常数!!
绝大部分的dp都应该从结尾状态推向开始状态
,因为最后的结果是固定的
一个比较常见的dp类型,问题大致是这个模板:
1~n这几个数字,每次随机出现,求每个数字都至少出现一次的期望随机次数,用 f [ i ] f[i] f[i]表示已经出现了 i i i个数字,剩下要出现 n − i n-i n−i个数字的期望,则
f [ i ] = i / n × f [ i ] + ( n − i ) / n × f [ i + 1 ] + 1 f[i]=i/n\times f[i]+(n-i)/n\times f[i+1]+1 f[i]=i/n×f[i]+(n−i)/n×f[i+1]+1
出现了 i i i个数字,那么再抽一次会有两种情况(1)抽到了重复的数字,概率 ( a ) (a) (a)是 i / n i/n i/n,此时的 X X X是 f [ i ] f[i] f[i](2)新抽到一个数字,概率 ( b ) (b) (b)是 ( n − i ) / n (n-i)/n (n−i)/n,此时的 Y Y Y是 f [ i + 1 ] + 1 f[i+1]+1 f[i+1]+1,因为新抽了一个数字就变成已经抽到 i + 1 i+1 i+1个数字了,同时还要加上当前抽了一次的贡献
当然,得出来最基础的dp式子一般是不行的,需要化简
f [ i ] = f [ i + 1 ] + n / ( n − i ) f[i]=f[i+1]+n/(n-i) f[i]=f[i+1]+n/(n−i)
经典例题:
青蛙跳荷叶(没想到常数也能套到公式里,dp不理解,这是个很简单但是很典型的期望dp)
绿豆蛙的归宿(上面的思路+拓扑)
莫比乌斯反演
技巧
1.交换循环顺序
2. 枚举gcd
3. 整除分块
4. 看到gcd=1,那么就直接莫比乌斯
例题
见此处
卷积
用于求积性函数前缀和(当然,不是一般的前缀和,而是很大,很长的,嗯)
重点就是记住这个式子:
g ( 1 ) S ( n ) = ∑ i = 1 n ∑ d ∣ n f ( d ) g ( n d ) − ∑ i = 2 n g ( i ) S ( n i ) g(1)S(n)=\sum_{i=1}^n\sum_{d|n}f(d)g(\frac{n}{d})-\sum_{i=2}^ng(i)S(\frac{n}{i}) g(1)S(n)=i=1∑nd∣n∑f(d)g(dn)−i=2∑ng(i)S(in)
待补充
高维前缀和
代码非常简单,只有三行
for(int j=0;j<22;j++)for(int i=0;i<(1<<22);i++)if((i>>j&1)) ans[i]+=ans[i^(1<<j)];
可以看出, i X O R ( 1 < < j ) iXOR(1<<j) iXOR(1<<j)为 i i i的子集,那么如果变成
ans[i^(1<<j)]+=ans[i];
就是后缀和啦
前面的条件也很重要,如果把条件换成这一位是0,那么求的就是超集( i i i是超集的子集)
经典例题:
O r P l u s M a x Or \;Plus \;Max OrPlusMax(找前缀最大值和次大值,又因为是<=k的,所以在输出答案的时候也要不断和之前的取最大值)
B i t s A n d P i e c e s Bits\; And \;Pieces BitsAndPieces(可以枚举 d [ i ] d[i] d[i],只需要找满足条件的 d j A N D d k d_jANDd_k djANDdk即可。考虑或的性质,和贪心,我要尽量把 d [ i ] d[i] d[i]原来是0的位置变成1,且从高位变,高位如果能变成1,后面任何不能把高位变成1的一定不优。于是先用高维前缀和(注意,这里i应该为子集,因为是或运算,只要这一位是1,其他位是什么无关)预处理出最靠后的j,k,然后枚举i判断就行了)
C o m p a t i b l e N u m b e r s Compatible\; Numbers CompatibleNumbers(找这个数取反后的子集就行了)
【技巧总结】——数学知识相关推荐
- 高三女生因高中数学知识的数列解题技巧没掌握与梦想大学失之交臂
高三女生因高中数学知识的数列解题技巧没掌握与梦想大学失之交臂 一漂亮高三女生在走出考场的那一刻已是泪流满面,问其原因竟是高考数学考试有关数列的考题没有能够做对,估计考分达不到自己理想大学的要求,其实高 ...
- codeforces#253 D - Andrey and Problem里的数学知识
这道题是这种,给主人公一堆事件的成功概率,他仅仅想恰好成功一件. 于是,问题来了,他要选择哪些事件去做,才干使他的想法实现的概率最大. 我的第一个想法是枚举,枚举的话我想到用dfs,但是认为太麻烦. ...
- 2013年图灵奖得主 Leslie Lamport 专访:程序员需要更多的数学知识
文章来源:AI科技评论 作者|李梅 编辑|陈彩娴 Leslie Lamport可能并不是一个家喻户晓的名字,但对于计算机科学家们来说,他是一些耳熟能详的「名字」幕后的贡献者.比如Paxos算法.排版程 ...
- 数学知识:和式的处理及二项式系数的运用
数学知识:和式的处理及二项式系数的运用 〇 这段时间看了一部分<具体数学>上的内容,正如第一章中所说,这本书的主要目的是: 说明不具备超人洞察力的人如何求解问题 也就是说,这本书主要讲述的 ...
- 数学/物理知识在软件/算法中应用(1),数学知识应用
> 数学知识 1.拉普拉斯算子可以给图像锐化:2.傅里叶变化可以给图像去燥啊,压缩啊,提取特征那些吧. 3.高斯模糊:4.RSA,大数难分解:5.了解矩阵,Android开发之图像处理那点事-- ...
- 虚幻引擎的数学知识学习教程 Math for Unreal Engine (Early Preview)
通过做真实世界的 Unreal Engine项目来学习数学 你会学到什么 理解游戏开发对数学的基本需求 将数学直接应用到用例中,而不是钻研理论(用我们的示例项目进行实践) 正确编辑短视频,节省您的时间 ...
- 入门深度学习的必备数学知识
作者:徐洲更 中科院在读遗传学博士.出于对计算机科学的兴趣,蜻蜓点水式自学了大量编程相关知识,现在对深度学习很感兴趣,正在恶补相关知识.此外,还负责帮忙管理生信媛,一个热衷于分享生物信息学知识的公众号 ...
- 机器学习、深度学习所需掌握的数学知识全都在这里了!
人工智能的基石是数学,没有数学基础科学的支持,人工智能很难行稳至远. -中国科学院院士.西安交通大学教授徐宗 [文末高薪招聘讲师!!!] 入行人工智能,所谓的门槛和挑战本质是你对数学知识的掌握程度. ...
- 人工智能的学习,需要学习哪些算法和数学知识呢?需要什么学历?
https://www.toutiao.com/a6661754579887063566/ 根据<人工智能影响力报告>显示: 人工智能科学家主要毕业于清华大学.中国科学院.中国科技大学.麻 ...
最新文章
- PyQt5初级——2
- jQuery元素操作
- 著名数据库状告分支,法院:100%开源为虚假宣传!
- SAP UI5 batch 请求的响应解析流程分析
- Mysql命令行下实现数据的导入
- 最老程序员创业札记:全文检索、数据挖掘、推荐引擎应用6
- 【Android开发】Android 颜色透明度换算
- 中保车服灾备云,为保险公司“上保险”
- ROST情感分析的语法规则_NLP技术之句法分析
- 客户服务器与p2p文件分发,P2P大文件分发技术 | 点量软件
- 【深度学习】图像超分实验:SRCNN/FSRCNN
- Java 遍历JsonNode
- 奋斗的小孩系列 FPGA学习altera系列: 第十六篇 分频器设计
- 随时随地可轻松赚钱的APP-自动赚钱宝
- Guava中EventBus并发处理事件
- 谷歌2014年中国区应届毕业生校园招聘B轮机试第一题——数独问题的解法(C++实现)
- 普通青年 文艺青年 2B青年
- 计算机专业英语词组,(计算机专业英语词组.doc
- android launcher3,android Launcher3 设置默认桌面应用
- MSN Messenger 7.0测试版公开推出 已经可以下载
热门文章
- Screen Snapshot for Mac(高效屏幕截图工具)
- ios系统换成android系统 游戏,2020王者荣耀苹果转换安卓系统 王者苹果转换安卓系统怎么转...
- CSS3动画(2D,3D,自定义动画)
- 二进制菜鸟之PE文件结构
- 命令详解-lsblk
- E-mail概述 | 邮件发送协议SMTP与邮件读取协议POP3、IMAP
- linux重命名得通配符,在Linux中如何一次重命名多个文件详解
- UE4中的Collision Presets理解
- nginx那点事儿——nginx日志详解
- 网易经典IP大作《梦幻西游网页版》开发经验分享