数论总结

一、费马小定理

$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;
}

 

posted @ 2022-08-15 19:59  niolle  阅读(39)  评论(0编辑  收藏  举报