1.求最大公约数(辗转相除,更相减损)
2.求约数个数以及约数和(单个求和区间求)
3.拓展欧几里得算法(解同余方程,不定方程,算乘法逆元)
4.筛素数(线性筛)
5.求乘法逆元(费马小定理,拓展欧几里得定理,递推式)
6.二项式定理
7.中国剩余定理
8.容斥定理
9.欧拉函数(单个求,区间求)
10.排列组合
11.中位数
12.Catalan数
1.求最大公约数
1.辗转相除就不多说了(不会的话下面你也不用看了)
2.更相减损法(对于求解特别特别大的两个数的最大公约数)
操作过程: 对于gcd(a,b)
1.a为奇数,b为偶数,gcd(a,b)=gcd(a,b div 2)
2.a为偶数,b为奇数,gcd(a,b)=gcd(a div 2,b)
3.a和b同为偶数,gcd(a,b)=gcd(a div 2,b div 2)*2;
4.a和b同为奇数,gcd(a,b)=gcd(a-b,b)(这是在a>b的情况下,总之是大的减小的,然后把较大的数放在前面会方便操作)
其实真正步骤是第四种,但是前三种可以大大降低时间复杂度
注意:能用到更相减损肯定要用高精度的,而且大多数要丧心病狂的压位,而且还要压好多位
2.求约数个数(以及n!中有多少个质因数)
一.求n!中有多少个质因数(如果求n!的话就是把这些乘起来)
f[i]表示筛出的小于等于n的质数(m为最大个数)
for i:=1 to m do
begin
y:=n; z:=0;
while y>=f[i] do begin y:=y div f[i]; z:=z+y; end;
d[i]:=z;
end;
二.求一个数n的约数个数
只筛选这一个数的质因数以及记录个数
例:A=p1^a*p2^b*p3^c
A的约数个数为(a+1) * (b+1) * (c+1)
三.求1~n的约数个数和
way1.
ans:=0
for i:=1 to n do
ans:=ans+(n div i);
way2.(思路:对于某一些约数个数相同的约数放在一起处理)
举个例子:求取小于等于12的数的约数个数
约数:12 11 10 9 8 7 6 5 4 3 2 1
个数: 1 1 1 1 1 1 2 2 3 4 6 12
发现总是有一段区间的约数个数是一样的,所以想办法把个数相同的放在一起
l,r表示约数个数相同的一段区间,(n div l)就是相同的这个约数个数为多少,
(r-l+1)就是区间长度,所以总约数个数就是(n div l)*(r-l+1)
ans:=0;
l:=1;
while l<=n do
begin
r:=n div (n div l);
ans:=ans+(n div l)*(r-l+1);
l:=r+1;
end;
exit(ans);
四:求1~n的所有约数的和
对于上面这种情况,少许变更即可
对于一段约数个数相同的区间,约数分别为l…..r,总个数为(r-l+1) *(n div l)
采用平均数的思想,即这段区间的约数和为(r-l+1) * (n div l) * (l+r) div 2(这是一定能整除的)
ans:=0;
l:=1;
while l<=n do
begin
r:=n div (n div l);
ans:=ans+(n div l) * (r-l+1) * (l+r) div 2;
l:=r+1;
end;
exit(ans);
五:求单个数的约数和
A=p1^a * p2^b * p3^c
约数和ans:=(1+p1+…+p1^a) * (1+p2+….+p2^b) * (1+p3+……+p3^c)
3.拓展欧几里得算法
应用:对于ax+by=gcd(a,b),求解x和y
1.求解同余方程:ax≡c(mod b)
例题:青蛙的约会(裸题)
2.求解乘法逆元
例:求a在mod p下的逆元
相当于解ax≡1(mod p)
求解x即可
4.线性筛素数
没什么好讲的
一种加的,一种乘的
乘法
t:=0;
for i:=2 to n do
begin
if not b[i] then
begin
inc(t);
f[t]:=i;
end;
for j:=1 to t do
if i*f[j]<=n then
begin
b[i*f[j]]:=true;
if i mod f[j]=0 then break;
end else break;
end;
加法
t:=0;
for i:=2 to n do
begin
if not b[i] then
begin
inc(t);
f[t]:=i;
end;
j:=i;
while j+i<=n do
begin
j:=j+i;
b[j]:=true;
end;
end;
5.求乘法逆元
(a在mod p下的乘法逆元)
1.费马小定理
—————————————————-不懂的自己查查
这种方法有较大的限制条件
要求a与p必须互质,求解十分简单直接求解a^(p-2)即可
2.拓展欧几里得定理
相当于解ax≡1(mod p),ax+py=1
求解x就好(似乎说过一遍了)
3.一个很好用的递推式,上面两种方法都大多只适合求单个或较少的,这种适合于n