数学&数论 知识总结

来源:互联网 发布:ubuntu 12.04 163源 编辑:程序博客网 时间:2024/05/21 06:42

数学&数论知识总结

gcd:

没啥可说的。

int Gcd(int a, int b){ return b==0 ? a : Gcd(b, a&b);}int Lcm(int a, int b){ return a * b / Gcd(a, b); }int Ex_gcd(int a, int b, int &x, int &y){    if(b == 0)  x = 1,  y = 0,  return a;    int sum = Ex_gcd(b, a%b, x, y);    int tt = x;    x = y,  y = tt - a / b * y;    return sum;}//充要条件__gcd(a,b)|c .bool Linear_E(int a, int b, int c, int &x, int &y){    int tt = Ex_gcd(a, b, x, y);    if(c % tt)  return 0;    int kk = c / tt;    x *= kk,  y *= kk;    return 1;}//求解 ax + by = c.bool Linear_M(int a, int b, int p){    int x, y;    int tt = Ex_gcd(a, p, x, y);    if(b % tt)  return 0;    int x0 = x * (b/tt) % p;    for(int i = 1; i < tt; i++)  printf("%d\n", (x0 + i*p/tt) % p);    return 1;}//求解 ax ≡b (mod p).

逆元的各种求法:

(a/b) % p == (a*b 的逆元) % p

__1: ans = a^(p-2) % p  (ax ≡1)    //费马小定理__2: ans = a/b % p = a % (m*b) / b  //(b|a)    //求逆元通用公式(不用考虑 exgcd 和 费马小定理 的互质限制)__3: i^-1 = - [p/i] / [p%i]     //递推 

欧拉函数:

小于等于n 且与n互质的数的数目

for(int i = 2; i <= n; i++)  fi[i]=i;    for(int i = 2; i <= n; i++){         if(fi[i] == i)         for(int j = i; j <= n; j += i)          fi[j] = fi[j] / i * (i-1);    } 
int Euler(int n){    int sum = 1;    for(int i = 2; i*i <= n; i++){        while(!(n&i)){            n /= i;            sum *= i-1;        }    }    if(n > 1)  sum *= n-1;    return sum;}

中国剩余定理(CRT):

中国剩余定理的五种解法 【懒人如我】

x ≡a1 (mod n1);x ≡a2 (mod n2);....=>x ≡a1 - u0n1 (mod lcm(n1, n2)).

快速幂:

依然没啥可说的。

int Pow(int a, int b, int p){    int sum = 1, tt = a&p;    while(b){        if(b & 1)  sum = (sum * tt) %p;        tt = (tt * tt) % p;        b >>= 1;    }    return sum;}//a^b%p__快速幂 ( 时间复杂度 log(b) ).int Pow_sum_mod(int a, int n, int p){    if(n == 1)  return a % p;    if(!(n % 2))  return Pow_sum_mod(a,n/2,p) * (Pow(a,n/2,p)+1) % p;       else return ( Pow_sum_mod(a,(n-1)/2,p)*(Pow(a,(n-1)/2,p)+1)+Pow(a,n,p) ) % p;}//等比数列 二分求和 取模.

矩阵快速幂:

ans ^= n    ->Mat ans = Mat(); ans.size = Size; //初始化ans矩阵.ans = Quickmulti(ans, n, p); 
const int Matr = ____; //矩阵大小.struct Mat{    int aa[Matr][Matr], size;      Mat(){ size = 0,  memset(aa, 0, sizeof(aa)); }}; //矩阵结构体,aa__矩阵,size__大小(从1开始).Mat Multi(Mat m1, Mat m2, int p){      Mat sum = Mat();    sum.size = m1.size;    for(int i = 1; i <= m1.size; i++)          for(int j = 1; j <= m2.size; j++){            if(m1.aa[i][j]){                 for(int k = 1; k <= m1.size; k++)                    sum.a[i][k] = (sum.aa[i][k]+m1.aa[i][j]*m2.aa[j][k]) % p;              }//稀疏矩阵优化.        }    return sum;  }//两个相等矩阵的乘法__对于稀疏矩阵,有0的地方(不用运算)的优化.Mat Quickmulti(Mat m,int n,int p){      Mat sum = Mat();    for(int i = 1; i <= m.size; i++)  sum.aa[i][i] = 1;      sum.size = m.size;      while(n){          if(n & 1)  sum = Multi(m, sum, p);          m = multi(m,m,mod);          n >>= 1;    }      return sum;  }//二分快速幂.void print(Mat mm){    printf("%d\n", mm.size);      for(int i = 0; i < mm.size; i++){        for(int j = 0; j < mm.size; j++)  printf("%d ", mm.aa[i][j]);          puts("");    }  }//输出矩阵信息,debug用.

筛法:

for(int i = 2; i <= sqrt(n+0.5); i++){    if(!sieve[i])    for(int j = i*i; j <= n; j += i)        sieve[j] = 1;}
int Sieve(int n){    vector<int> prime;  vector<int> ispri;    for(int i = 1; i <= n; i++)  ispri[i] = 1;    for(int i = 2; i <= n; i++){        if(ispri[i]) prime.push_back(i);        for(int j = 0; j < prime.size(); j++){            if(prime[i]*i <= n)  ispri[prime[j]*i] = 0;            else break;            if(!(i%prime[j]))  break;        }    }}//线筛.

高斯消元:

高斯表示不要把他的名字拼错。

bool gauss(){    int now = 1, to;    double t;    for(int i = 1; i <= n; i++){        for(to = now; to <= n; to++)  if(fabs(a[to][i]) > eps)  break;        if(to > n)  return 1;        if(to != now)          for(int j = 1; j <= n+1; j++)  swap(a[to][j], a[now][j]);        t = a[now][i];        for(int j = 1; j <= n+1; j++)  a[now][j] /= t;        for(int j = 1; j <= n; j++){            if(j != now){                t = a[j][i];                for(int k = 1; k <= n+1; k++){                    a[j][k] -= a[now][k] * t;                }            }        }        now++;    }    for(int i = 1; i <= n; i++)      if(fabs(a[i][n+1] > eps))  return 0;    return 1;}//高斯消元.

高精:

高精表示她其实很简单。
注意高精减/除的各种特判。
高精除高精实际上是一个极其复杂的过程(只是因为懒得写)。
【懒人如我】 【网址都懒得贴】

模运算法则

(a + b) % c = (a % c + b % c) % c
适用于 + - *
加法&乘法 结合律&分配律 可用

数学定理

数学定理总结

Stirling 数
约瑟夫问题
Catalan数
.
.
.

矩阵乘法

前行 * 后列

矩阵快速幂

位运算

注意优先级

常用位运算总结

原创粉丝点击