exgcd&&中国剩余定理专题练习

hdu1573求中国剩余定理解的个数

#include <iostream>
#include <cstdio>

using namespace std;
int a[100],b[100];
int exgcd(int a,int b,int &x,int &y){
    if(b==0){
        x=1;y=0;return a;
    }
    int d=exgcd(b,a%b,x,y),t;
    t=x;x=y;y=t-a/b*y;
    return d;
}
int main(){
    int T;scanf("%d",&T);
    while(T--){
        int n,m;scanf("%d%d",&n,&m);
        for(int i=0;i<m;++i) scanf("%d",a+i);
        for(int i=0;i<m;++i) scanf("%d",b+i);
        int a1=a[0],r1=b[0],flag=0;
        for(int i=1;i<m;++i){
            int a2=a[i],r2=b[i];
            int d=r2-r1,x,y,GCD=exgcd(a1,a2,x,y);
            if(d%GCD){
                flag=1;break;
            }
            x*=d/GCD;int mod=a2/GCD;
            x=(x%mod+mod)%mod;
            r1=x*a1+r1;
            a1=a1*a2/GCD;
        }
        if(r1>n||flag) printf("0\n");
        else printf("%d\n",(n-r1)/a1+1-(r1==0?1:0));//没考虑r1==0的情况
    }
}

poj1061 列同余方程,exgcd解方程

#include <iostream>
#include <cstdio>

using namespace std;
typedef long long ll;
ll exgcd(ll a,ll b,ll &x,ll &y){
    if(b==0){
        x=1;y=0;return a;
    }
    ll d=exgcd(b,a%b,x,y),t;
    t=x;x=y;y=t-a/b*y;
    return d;
}
int main(){
    ll x,y,m,n,L;
    while(~scanf("%I64d%I64d%I64d%I64d%I64d",&x,&y,&m,&n,&L)){
        ll rx,ry,GCD,D=((y-x)%L+L)%L,A=((m-n)%L+L)%L;
        GCD=exgcd(A,L,rx,ry);
        if(D%GCD) {
            printf("Impossible\n");continue;
        }
        ll mod=L/GCD;rx*=D/GCD;
        rx=(rx%mod+mod)%mod;
        printf("%I64d\n",rx);
    }
    return 0;
}

poj2115 不互质情况下又需要求类似逆元的东西

#include <iostream>
#include <cstdio>

using namespace std;
typedef long long ll;
ll A,B,C,k;
ll exgcd(ll a,ll b,ll &x,ll &y){
    if(b==0) {
        x=1;y=0;return a;
    }
    ll d=exgcd(b,a%b,x,y),t;
    t=x;x=y;y=t-a/b*y;
    return d;
}
int main(){
    while(~scanf("%I64d%I64d%I64d%I64d",&A,&B,&C,&k)){
        if(A+B+C+k==0) break;
        ll n=(1ll<<(k));
        ll D=((B-A)%n+n)%n,x,y,GCD;
        GCD=exgcd(C,n,x,y);
        if(D%GCD){
            printf("FOREVER\n");continue;
        }
        ll mod=n/GCD;x*=D/GCD;
        x=(x%mod+mod)%mod;
        printf("%I64d\n",x);
    }
    return 0;
}

poj2891 一元线性方程组-不互质的中国剩余定理

#include <iostream>
#include <cstdio>

using namespace std;
typedef long long ll;
ll gcd(ll a,ll b){
    return b==0?a:gcd(b,a%b);
}
ll exgcd(ll a,ll b,ll &x,ll &y){
    if(b==0){
        x=1;y=0;return a;
    }
    ll d=exgcd(b,a%b,x,y),t;
    t=x;x=y;y=t-a/b*y;
    return d;
}
int main(){
    ll k;
    while(~scanf("%I64d",&k)){
        ll a1,r1,a2,r2,ans;scanf("%I64d%I64d",&a1,&r1);
        int flag=0;
        for(int i=1;i<k;++i){
            scanf("%I64d%I64d",&a2,&r2);
            if(flag) continue;
            ll d=r2-r1,x,y,GCD=gcd(a1,a2);
            if(d%GCD) {
                flag=1;continue;
            }
            ll A1=a1/GCD,A2=a2/GCD,D=d/GCD;
            exgcd(A1,A2,x,y);
            x*=D;x=(x%A2+A2)%A2;
            r1=x*a1+r1;
            a1=a1*a2/GCD;
        }
        if(flag)     printf("-1\n");
        else         printf("%I64d\n",r1);
    }
    return 0;
}

poj 1006 高峰期出现的同一天,中国剩余定理

#include <iostream>
#include <cstdio>

using namespace std;
int p,e,i,d;
int exgcd(int a,int b,int &x,int &y){
    if(b==0){
        x=1;y=0;return a;
    }
    int d=exgcd(b,a%b,x,y),t;
    t=x;x=y;y=t-a/b*y;
    return d;
}
int main(){
    int cas=0;
    while(~scanf("%d%d%d%d",&p,&e,&i,&d)){
        if(p+e+i+d==-4) break;
        int N=23*28*33,K,x,y,ans=0;
        exgcd(23,K=N/23,x,y);y=(y%23+23)%23;
        ans=(ans+K*y*(p-d))%N;
        exgcd(28,K=N/28,x,y);y=(y%28+28)%28;
        ans=(ans+K*y*(e-d))%N;
        exgcd(33,K=N/33,x,y);y=(y%33+33)%33;
        ans=(ans+K*y*(i-d))%N;
        if(ans<=0) ans+=N;
        printf("Case %d: the next triple peak occurs in %d days.\n",++cas,ans);
    }
    return 0;
}

poj2142 对exgcd得出的|s|+|t|最小的解,求s>0时t为多少,t>0时s为多少,两个方向求一下最小正整数解

#include <iostream>
#include <cstdio>

using namespace std;
int a,b,d;
int gcd(int a,int b){
    return b==0?a:gcd(b,a%b);
}
int exgcd(int a,int b,int &x,int &y){
    if(b==0){x=1;y=0;return a;}
    int d=exgcd(b,a%b,x,y),t;
    t=x;x=y;y=t-a/b*y;
    return d;
}
int main(){
    while(~scanf("%d%d%d",&a,&b,&d)){
        if(a+b+d==0) break;
        int GCD=gcd(a,b);
        a/=GCD,b/=GCD,d/=GCD;
        int x,y;exgcd(a,b,x,y);
        int x1,y1,x2,y2;
        x1=x*d;
        x1=(x1%b+b)%b;y1=(d-a*x1)/b;if(y1<0) y1=-y1;
        y2=y*d;
        y2=(y2%a+a)%a;x2=(d-b*y2)/a;if(x2<0) x2=-x2;
        if(x1+y1>x2+y2) {
            x1=x2;y1=y2;
        }
        printf("%d %d\n",x1,y1);
    }
    return 0;
}
时间: 2024-10-27 06:40:29

exgcd&&中国剩余定理专题练习的相关文章

欧几里得(辗转相除gcd)、扩欧(exgcd)、中国剩余定理(crt)、扩展中国剩余定理(excrt)简要介绍

1.欧几里得算法(辗转相除法) 直接上gcd和lcm代码. 1 int gcd(int x,int y){ 2 return y==0?x:gcd(y,x%y); 3 } 1 int lcm(int x,int y){ 2 return x*y/gcd(x,y); 3 } 2.扩欧:exgcd:对于a,b,一定存在整数对(x,y)使ax+by=gcd(a,b)=d ,且a,b互质时,d=1. x,y可递归地求得. 我懒得改返回值类型了 1 long long exgcd(long long a,

Hello Kiki(中国剩余定理——不互质的情况)

Hello Kiki Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 247 Accepted Submission(s): 107   Problem Description One day I was shopping in the supermarket. There was a cashier counting coins serio

lightoj 1319 - Monkey Tradition (中国剩余定理)

1319 - Monkey Tradition PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 MB In 'MonkeyLand', there is a traditional game called "Bamboo Climbing". The rules of the game are as follows: 1)       There are N monkeys who play

对于中国剩余定理(CRT)的初步理解

以前觉得用中国剩余定理来求同余方程组很鸡肋,因为可以用拓展欧几里得算法来构造出一种更加强大(可以处理取模的数(默认为mi)不互质的情况)的算法. 今天查了点资料,发现我太天真了. 首先讲讲中国剩余定理: 即 : x ≡ a[i] (mod m[i]) 1<= i <= r (m[i] 两两互质) 求这个同余方程组可以快速算: x = ∑M/m[i] * Inv(M/m[i], m[i]) * a[i] (mod M) 其中M = m[1]*m[2]*m[3]...m[r]  , Inv(x,

HDU 5446 中国剩余定理+lucas

Unknown Treasure Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 2389    Accepted Submission(s): 885 Problem Description On the way to the next secret treasure hiding place, the mathematician

Bell(hdu4767+矩阵+中国剩余定理+bell数+Stirling数+欧几里德)

Bell Time Limit:3000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 4767 Description What? MMM is learning Combinatorics!? Looks like she is playing with the bell sequence now: bell[n] = number of ways to part

【中国剩余定理】【容斥原理】【快速乘法】【数论】HDU 5768 Lucky7

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5768 题目大意: T组数据,求L~R中满足:1.是7的倍数,2.对n个素数有 %pi!=ai  的数的个数. 题目思路: [中国剩余定理][容斥原理][快速乘法][数论] 因为都是素数所以两两互素,满足中国剩余定理的条件. 把7加到素数中,a=0,这样就变成解n+1个同余方程的通解(最小解).之后算L~R中有多少解. 但是由于中国剩余定理的条件是同时成立的,而题目是或的关系,所以要用容斥原理叠加删

数论快速入门(同余、扩展欧几里德、中国剩余定理、大素数测定和整数分解、素数三种筛法、欧拉函数以及各种模板)

数学渣渣愉快的玩了一把数论,来总结一下几种常用的算法入门,不过鶸也是刚刚入门, 所以也只是粗略的记录下原理,贴下模板,以及入门题目(感受下模板怎么用的) (PS:文中蓝色字体都可以点进去查看百度原文) 附赠数论入门训练专题:点我打开专题(题目顺序基本正常,用以配套数论入门) 一.同余定理 简单粗暴的说就是:若 a-b == m 那么 a%m == b%m 这个模运算性质一眼看出...直接上入门水题: Reduced ID Numbers 附AC代码(这个也没啥模板....知道就好) #inclu

Bell(hdu4767+矩阵+中国剩余定理)

Bell Time Limit:3000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 4767 Description What? MMM is learning Combinatorics!? Looks like she is playing with the bell sequence now: bell[n] = number of ways to part