数论总结
一、费马小定理
$a^{p-1}≡1(mod p)$
$条件:p是质数,a不是p的倍数$
二、扩展欧几里得
$求解形如ax+by=t(mod P)的问题$
前提条件:$t=kgcd(k \in N^{*})$
公式推导$a' \times x' + b' \times y' = gcd$
$\because x'=y, y'=x \space mod \space y=x- \lfloor \frac{x}{y} \rfloor \times y$
$\therefore a' \times y+b' \times (x- \lfloor \frac{x}{y} \rfloor \times y)=gcd$
化简可得:$b' \times x +(a'-b' \times \lfloor \frac{x}{y} \rfloor) \times y=gcd$
$\therefore a=b',b=(a'-b' \times \lfloor \frac{x}{y} \rfloor)$
三、中国剩余定理
m[i]为模数,a[i]为余数
$ans \space = \space \sum a_iM_it_i$
$其中,M_i表示除ai外所有质数的乘积,且a_iM_it_i \equiv a_i(Mod \space M)$
$即t_i能令M_i*t_i \equiv 1(Mod \space m_i)$
直接扩欧即可
四、扩展中国剩余定理
和中国剩余定理相比,只是把$M=\prod \space m_i \space 改为了 \space M=LCM(m_1,m_2,…,m_n)$
每一次,我们只需要求出$ans+M \times x \equiv a_i (Mod \space m_i)$
即$M\times x+m_i \times y=a_i-ans$
扩欧即可
五、卢卡斯定理
定义:$C_{n}^{m}\equiv C_{n/p}^{m/p} * C_{n mod p}^{m mod p} (mod p)$
条件:$p是质数$
证明:1.由费马小定理可知$a^{p} \equiv p(mod p)$
2.你需要知道二项式定理
3.$\therefore (1+x)^{p} \equiv 1+x^{p} $——这个用前两个东西证就好
4.$\therefore (1+x)^{n}$
$=(1+x)^{(n/p) \times p} \times (1+x)^{n mod p}$
$\equiv (1+x^{p})^{n/p} \times ({1+x})^{n mod p}$
$\equiv \sum\limits_{i=0}^{n/p} C_{n/p}^{i} \times x^{pi} \times \sum\limits_{j=0}^{n \space mod \space p} C_{n\space mod \space p}^{j} \times x^{j}$
$\equiv \sum\limits_{i=0}^{n/p} \sum\limits_{j=0}^{n mod p} C_{n/p}^{i} \times C_{n\space mod \space p}^{j} \times x^{pi+j}$
对于$x^{m}$这一项,我们可以发现左边的式子中这一项的系数是$C_{n}^{m}$,而右边呢,$i=m/p$,$ j=m mod p ,C_{n/p}^{i} \times C_{n\space mod \space p}^{j} \times x^{pi+j}$
$\therefore C_{n}^{m}\equiv C_{n/p}^{m/p} \times C_{n mod p}^{m mod p} (mod p)$
六、高斯消元
将第i行第i位的系数除至1,然后用加减消元法将其它行的第i列减至0即可
无解判断:前i列处理好后第i+1列都为0
#include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #include<cstring> #define int long long #define rep(i,a,b) for(int i=a;i<=b;i++) #define dwn(i,a,b) for(int i=a;i>=b;i--) #define MAXN 110 using namespace std; const double EPS=1e-8; double B[MAXN][MAXN]; int n; signed main(){ scanf("%d",&n); rep(i,1,n){ rep(j,1,n+1) scanf("%lf",&B[i][j]); } rep(i,1,n){ int k=i; rep(j,i,n) if(fabs(B[j][i])-fabs(B[k][i])>=EPS) k=i; if(!B[k][i]){printf("No Solution"); return 0;} rep(j,1,n+1){ double g=B[i][j]; B[i][j]=B[k][j]; B[k][j]=g; } rep(j,i+1,n+1) B[i][j]/=B[i][i]; rep(j,1,n+1) if(i!=j) rep(k,i+1,n+1) B[j][k]-=B[j][i]*B[i][k]; } rep(i,1,n) printf("%.2lf\n",B[i][n+1]); return 0; }