数论模板复习

基本结论:

费马小定理:若p为质数,则

 欧拉定理:若a,n互质,则

 欧拉函数计算公式:

 

扩展欧几里得算法(Exgcd)

计算不定方程的一组特解。

由贝祖定理,上方程有解当且仅当时有解。代码中exgcd函数求出的是的解。将其乘上c/d即可得到原方程的解。

设x',y'为方程的一组特解,则方程通解可表示为:

代码:

int a,b,c,d,t,x,y;
int exgcd(int a,int b,int &x,int &y) {
    if(b == 0) {
        x=1; y=0; return a;
    }
    int dd=exgcd(b,a%b,x,y),xx=x;
    x=y; y=xx-(a/b)*y;
    return dd;
}
int main() {
    a=read(); b=read(); c=read();
    x=0; y=0;
    d=exgcd(a,b,x,y);
    if(c % d) {
        printf("-1\n");
    }
    x=x*b/d; y=y*a/d;
    printf("%d %d ",x,y);
}

上文代码不能保证x非负。若要得到x的最小正整数解,还要加入下面这句话:

x=(x % b +b)%b;

对于线性同余方程 ,我们可以将其转化成不定方程来求解

 

乘法逆元

用于将取模时的除法运算转换成乘法运算。中的x.

求法:

1.费马小定理+快速幂

a,p互质时,逆元即为ap-2(mod p)

2.exgcd

即求解同余方程  

3.线性递推求1~n中每个数的逆元

    inv[1]=1;
    for(int i=2;i<=n;i++) {
        inv[i]=(p-p/i)%p*inv[p%i];
        printf("%d\n",inv[i]);
    }

 

中国剩余定理

 用于求解如下同余方程组:

解法:

当mi两两互质时,有:

 

任意解即为 x+k*M.

代码:

ll M[N],a[N],m[N],mm;
ll x,y,d,ans;
ll exgcd(ll a,ll b,ll &x,ll &y) {
    if(b == 0) {
        x=1; y=0; return a;
    }
    ll dd=exgcd(b,a%b,x,y),xx=x;
    x=y; y=xx-(a/b)*y;
    return dd;
}
int main() {
    for(int i=1;i<=n;i++) {
        m[i]=read(); mm*=m[i]; a[i]=read();
    }
    for(int i=1;i<=n;i++) {
        M[i]=mm/m[i];
        x=0; y=0;
        d=exgcd(M[i],m[i],x,y);
        x=(x%m[i]+m[i])%m[i];
        ans+=x*M[i]*a[i];
    }
}

当mi不互质时,我们仍可以通过使用k次exgcd来求出这个解。

代码:

 

 

杂项

快速幂:

long long qpow(int a,int b,int p) {
    ll x=a,ans=1;
    while(b) {
        if(b & 1) ans=ans*x%p;
        x=x*x%p;
        k>>=1;
    }
    return ans;
}

等比数列求和:

1.分治

2.公式+逆元

 

 

posted @ 2021-10-19 22:24  残碑小筑  阅读(54)  评论(0)    收藏  举报
faults = { minSize : 10, maxSize : 20, newOn : 1000, flakeColor : "#FFFFFF" /* 此处可以定义雪花颜色,若要白色可以改为#FFFFFF */ }, options = $.extend({}, defaults, options); var interval= setInterval( function(){ var startPositionLeft = Math.random() * documentWidth - 100, startOpacity = 0.5 + Math.random(), sizeFlake = options.minSize + Math.random() * options.maxSize, endPositionTop = documentHeight - 200, endPositionLeft = startPositionLeft - 500 + Math.random() * 500, durationFall = documentHeight * 10 + Math.random() * 5000; $flake.clone().appendTo('body').css({ left: startPositionLeft, opacity: startOpacity, 'font-size': sizeFlake, color: options.flakeColor }).animate({ top: endPositionTop, left: endPositionLeft, opacity: 0.2 },durationFall,'linear',function(){ $(this).remove() }); }, options.newOn); }; })(jQuery); $(function(){ $.fn.snow({ minSize: 5, /* 定义雪花最小尺寸 */ maxSize: 80,/* 定义雪花最大尺寸 */ newOn: 200 /* 定义密集程度,数字越小越密集 */ }); });