ACM数学常用知识
- 最大公约数,最小公倍数
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);
}
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);
}
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 }
View Code
组合数性质:从这看到的:传送门
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)
品全部错位的方案数)**
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)