ACM数学常用知识

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;

**>>矩阵快速幂 **

img img

 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**函数中加一个小优化:*

img img

 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.排列组合

img

img img

 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

组合数性质:从这看到的:传送门

img

img

img

img

img

img

img

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)

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值