数学总结
在感受了picks的课后,发现OI中的数学是非常难的。虽然最近考试的题目并不难,但由于我天生推不出公式想不出数学方法智商捉急的基因导致各种考试想不到,主要原因还是做题做少了,方法知识不够健全,还是有必要总结一下的。
求一个数对于mod的逆元:
费马定理:
P为素数,a为正整数,a与P互质,则a^(p-1) ≡ 1 (mod p)
所以一个数的逆元就是a^(p-2)
应用:在取模的情况下做除法
拆分一个数:
(1) 唯(惟)一分解定理
若整数a≥2,那么a一定能分解成若干个素数的乘积(唯一的形式)。ep. 1260=2*2*3*3*5*7.
要拆一个数较快的方法:先筛素数,然后把每个数的最小质因子记录下来,最后要用哪个数就拆哪个数。
应用:
求约数和,求约数个数(每个质数的幂+1的积),然后还有各种题目问的畸形问题
拓展欧几里德原理 ax+by=c
先求出gcd d,看c是否整除d判断无解,然后把a/d,b/d,c/d,求出x,y就是一组解
因
p * a+q * b = c的其他整数解满足:
p = p1 + b/Gcd(a, b) * t
q = q1 - a/Gcd(a, b) * t(其中t为任意整数)
p 、q就是p * a+q * b = c的所有整数解。
所以x的最小正整数解就是((x*c)%b+b)%b,y也是同理
应用:各种追击问题,相遇问题问最小步数操作数什么的,还有解模线性方程,跟孙子定理也有关
中国剩余定理(孙子定理)
对于一个X≡2 (mod 3) X≡3 (mod 5) X≡2 (mod 7)解方程
可以转化为
3个模方程组,
x≡1(mod 3) x≡0(mod 3) x≡0(mod 3)
x≡0(mod 5) x≡1(mod 5) x≡0(mod 5)
x≡0(mod 7) x≡0(mod 7) x≡1(mod 7)
最后再乘以除掉的系数模掉原来的模值就能得到x的最小解了
2 *70+3*21+2*15≡23(mod 105)
欧拉定理 a?φ(n)≡1modn
欧拉函数φ(x)
? 表示1~x所有与x互质的数
? 积性函数
? 计算公式
? 性质
? 应用 计算与某个x的gcd为定值k的数的数量:φ(x/k)等
? 例题 [BZOJ 2705][BZOJ 2818]
欧拉定理
? 推广 对任意于a,n 有an≡anmodφ(p)+φ(p)modp
对于互质的a,n 有 an≡anmodφ(p)modp
简单的计数
容斥原理
o DeMorgan定理
o 错排问题 递推式f[n]=(n-1)*(f[n-1]+f[n-2]);
就是我容斥一直没理解,然后连考了2天容斥都打挂
有两种不同的类型,一种是由于社么什么限制,求方案数,这时就假设没限制预处理出所有情况的方案数在数组中,然后
void dfs(long long x,long long y)
{
if(m<0)
return;
if(x>k)
{
if(y&1)
ans=(ans-f[m])%mod;
else
ans=(ans+f[m]+mod)%mod;
return;
}
m-=l[x]+1; //因为第x钟至少要l[x]+1个才超限,m剩下的就是这n个随便配的数量,包括第x个(因为可能有l[x]+2,l[x]+3个的可能性)
dfs(x+1,y+1);
m+=l[x]+1;
dfs(x+1,y);
}
另一种就是在区间中去哪些数字的倍数或者不去那些数字的倍数:
void dfs(long long x,long long y,long long z)
{
if(x>n)
{
if(y&1)
ans-=r/z-(l-1)/z;
else
ans+=r/z-(l-1)/z;
return;
}
dfs(x+1,y,z);
double tmp=(double)b[x]*z/gcd(z,b[x]); //double存的数比long long 高,但具体值会出错
if(tmp<=r) //求之前选了的数与现在要选的数的lcm
dfs(x+1,y+1,tmp);
}
应用:一些求方案数,[l,r]区间中有多少xx的数字之类的问题
莫比乌斯反演:
本质还是容斥,
莫比乌斯函数
? 定义 略
? 性质 (二项式定理证明)
? 积性函数
? 线性筛
可以通过求一些可以直接求的东西反演得到一些不好求的东西
莫比乌斯反演定理
? 第二个在求gcd等问题中非常常见
说到求反演后的值,一个很喜闻乐见的优化就是下底函数分块。
比如F(d)=(n/d)*(m/d) 我们会发现n/d,m/d的值会在不同的区间一样,
比如当前区间的第一个为i,那么这个区间的最后一个就是min(n/(n/i),m/(m/i))然后+1就得到了下个区间的第一个,这样我们对莫比乌斯函数进行一个前缀和的预处理,就能在计算时大大优化。
然而我经常推不出反演的式子
组合:
有很多思维方法可以帮助找出组合数。
比如想象出插杆子把一些东西分开,有多少个空插,
或者就对某一个进行考虑,然后乘上所有的个数。
求C的化一般就是暴力+求逆元除
Lucas定理在取模值比较小的时候能跟快的求出C:
Lucas(m,n)=C(m/p,n/p)*C(m%p,n%p)%p=Lucas(m/p,n/p)*C(m%p,n%p)%p。
然而组合的式子我还是经常性的想不到推不出,还是自己弱,需要多练习
斐波那契数列:
求gcd中,递归次数最多。
当且仅当M是N的倍数时,Fn是Fm的约数!
使用矩阵乘法快速幂得到F[I]
卡特兰数列。
o 通项公式 有时候因为题目要求不同,转化成C(2n,n)/(n+1)也是一样的
o 递推关系
f(n)=f(n-1)*(4*n-2)/(n+1);也是一样的
应用:
括号化问题。出栈次序问题。将多边行划分为三角形问题。给顶节点组成二叉树的问题。
一一对应:
什么向南走想北走不能走到北方啊,在坐标轴里走不能越界啊之内的,就是一个思想,想上走一步越界的情况和向下走一步每越界的情况是一样的方案数,所以就是C(M+N,N)-C(M+N,X+1)或者x-1,要看题目意思。
然而我对这个思想并不是通透。。只会通过对拍来乱高出组合式
最后就是一些筛法,贴个我的博客的网址把er。
http://blog.csdn.net/liufengwei1/article/details/46800169
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/liufengwei1/article/details/46881409