您的位置:首页 > 其它

数学&数论 知识总结

2017-08-17 16:04 281 查看

数学&数论知识总结

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(<
4000
span class="hljs-keyword">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数

.

.

.

矩阵乘法

前行 * 后列

矩阵快速幂

位运算

注意优先级

常用位运算总结
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数学 NOIP IOer