这一星期感觉学到不少东西,对于慢热型的我来说,距离熟练应用还是有一段距离。
不知道怎么回事,明明发布博客成功再次查看却少了后大半段,又重新写了后半部分,今天诸事不宜啊.......
还有20天左右就放假了哈哈哈,希望这些天里可以学到很多东西。
首先接触到了整除和同余、扩展欧几里得问题,后来又看了中国剩余定理、母函数、卡特兰数、斐波那契数列、组合数学等。
1.整除问题一部分是要自己推演发现规律,平时要多积累经验;
还了解到ax+by=c有整数解的充要条件是gcd(a,b)可以整除c,即c%gcd=0;若一组解(可通过扩展欧几里得求出)为x0,y0,
则所有整数解为x=x0+b/gcd(a,b)*t,y=y0-a/gcd(a,b)*t。其中t为整数。
2.同余问题常见一个形式是a☰b(mod m)意义为a-b=m*k。
这一节里学到了快速幂和快速积及取模代码,素数高效筛法和类似筛选素数的算法也得到了巩固。
3.最大公约数gcd 部分代码 y==0?x:gcd(y,x%y);
可以通过不断去除因子2来改进gcd算法。
4.扩展欧几里得用来求ax+by=GCD(a,b);已知a,b求一组x0,y0;
在一组方程ax+by=c中,它相当于ax☰c(mod b)有整数解的充要条件是c%GCD(a,b)=0;
例如以前见到的一道ax☰1(mod b)的题,让求出最小的正整数x,就可以利用欧几里得扩展算法来算出一个x,进而利用(x%t+t)%t
来求出最小x。其中t=b/GCD(a,b)。
5.中国剩余定理,用来求解模线性方程组解。
x☰a[1]mod w[1];
x☰a[2]mod w[2];
x☰a[3]mod w[3];
.................
其中w,a数组已知,且w[i]与w[j]互质,求x。
就用到中国剩余定理。方程组有整数解。并且在模M=m1*m2*……*mk下的解是唯一的,解为:
其中Mi=M/m[i],而Mi^-1为Mi模m[i]的逆元。
那么逆元怎么求呢?就要用到扩展欧几里得算法
exgcd(w[i],m,x,y)得到的y就是其逆元,具体代码参考:https://blog.csdn.net/lanshan1111/article/details/81332509
6.斐波那契数列,其通式为(m^n-s^n)/sqrt(5)
m=(1+sqrt(5))/2,n=(1-sqrt(5))/2。但是编程时这个n在50以上时就爆了,还是用递推公式。
7.卡特兰数 1,2,5,14,42,132,429....................
通式1为 ∑(0->n-1)f(i)*f(n-i-1)
通式2为 f(n-1)*(4*n-2)/(n+1)
通式3为 c(2n,n)/(n+1)
通式4为 c(2n,n)-c(2n,n-1)
求c(m,n)伪代码
int s1=1;
int s2=1;
for(int i=1;i<=m;i++)
{
s1*=(n-i+1);
s2*=i;
}
return s1/s2;
8.素数判断,包括穷举法、高效筛法及素数测试
9.欧拉定理
欧拉函数是指:小于等于n的数中与n互质的数的数目。
常用性质有:
n为一个素数p,则phi[p]=p-1;
n为一个素数的p的p^a,则,phi[p^a]=(p-1)*p^(a-1)
若n为两个互质数的积,phi[n]=phi[a]*phi[b];
10.欧拉筛法
欧拉筛法可以同时判断素数和求出欧拉函数的值。
三个性质:
p为质数:
phi[p]=p-1;
若i%p==0
phi[i*p]=p*phi[i]
若i%p!=0
则phi[i*p]=(p-1)*phi[i]
一星期训练结束了,可是距离熟练应用还是有很长的距离。向身边的人学习吧,多努力一些。还是那句话,既然做了就好好做。