1.最大公约数,最小公倍数
int gcd(int x,int y) { int z=y; while(x%y!=0) { z=x%y; x=y; y=z; } return z; } int lcm(int x,int y) { return x*y/gcd(x,y); }
2.快速幂
1 int qpow(int a,int b,int mod)//a^b 2 { 3 int t=1; 4 while(b) 5 { 6 if(b&1) 7 { 8 t=(t*a)%mod; 9 b--; 10 } 11 a=(a*a)%mod; 12 b>>=1; 13 } 14 return t;
>>矩阵快速幂 很久以前收集的模板,亲测可用
1 struct Matrix 2 { 3 int m[3][3]; 4 }; 5 6 Matrix Mul(Matrix a,Matrix b) 7 { 8 Matrix c; 9 memset(c.m,0,sizeof(c.m)); 10 for(int i=0;i<3;i++) 11 for(int j=0;j<3;j++) 12 for(int k=0;k<3;k++) 13 c.m[i][j] += ((a.m[i][k]*b.m[k][j])%SMod + SMod)%SMod; 14 return c; 15 } 16 17 Matrix fastm(Matrix a,int n) 18 { 19 Matrix res; 20 memset(res.m,0,sizeof(res.m)); 21 res.m[0][0] = res.m[1][1] = res.m[2][2] = 1; 22 while(n) 23 { 24 if(n&1) 25 res = Mul(res,a); 26 n>>=1; 27 a = Mul(a,a); 28 } 29 return res; 30 } 31 32 Matrix MPow(Matrix a,int n) //第二种写法,慎用,易RE 33 { 34 if(n == 1) 35 return a; 36 Matrix res = fastm(a,n/2); 37 res = Mul(res,res); 38 if(n&1) 39 res = Mul(res,a); 40 return res; 41 }
另外一种
1 struct Matrix 2 { 3 lll m[13][13]; 4 Matrix() 5 { 6 memset(m,0,sizeof(m)); 7 for(int i=1;i<=n+2;i++) 8 m[i][i] = 1LL; 9 } 10 }; 11 12 Matrix Mul(Matrix a,Matrix b) 13 { 14 Matrix res; 15 int i,j,k; 16 for(i=1;i<=n+2;i++) 17 { 18 for(j=1;j<=n+2;j++) 19 { 20 res.m[i][j] = 0; 21 for(k=1;k<=n+2;k++) 22 res.m[i][j] = (res.m[i][j]+(a.m[i][k]*b.m[k][j])%SMod + SMod)%SMod; 23 } 24 } 25 return res; 26 } 27 28 Matrix fastm(Matrix a,int b) 29 { 30 Matrix res; 31 while(b) 32 { 33 if(b&1) 34 res = Mul(res,a); 35 a = Mul(a,a); 36 b >>= 1; 37 } 38 return res; 39 }
对元素0较多的矩阵取快速幂时可在Mul函数中加一个小优化:
1 Matrix Mul(Matrix a,Matrix b) 2 { 3 Matrix res; 4 int i,j,k; 5 memset(res.m,0,sizeof(res.m)); 6 for(k=1;k<=n+2;k++) 7 { 8 for(i=1;i<=n+2;i++) 9 { 10 if(a.m[i][k]) 11 { 12 for(j=1;j<=n+2;j++) 13 res.m[i][j] = (res.m[i][j]+(a.m[i][k]*b.m[k][j])%SMod + SMod)%SMod; 14 } 15 } 16 } 17 return res; 18 }
3.排列组合
1 LL A(int n,int m)//n>=m 2 { 3 int ans=1; 4 if(n<m)return 0; 5 while(m--) 6 { 7 ans*=n; 8 n--; 9 } 10 return ans; 11 } 12 LL C(int n,int m) 13 { 14 if(n<m)return 0; 15 return A(n,m)/A(m,m); 16 }
组合数性质:从这看到的:https://blog.csdn.net/litble/article/details/75913032
4.错排
D(n) = (n-1) [D(n-2) + D(n-1)](n物品全部错位的方案数)
D(n) = n! [(-1)^2/2! + … + (-1)^(n-1)/(n-1)! + (-1)^n/n!].
记住公式就知道代码了
5.费马小定理: 假如p是质数,且gcd(a,p)=1,那么 a^(p-1)≡1(mod p)。(如果a为整数,p为质数,a和p互质,则a的p-1次幂对p取模永远等于1)
本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。