表达整数的奇怪方式

题目链接

题意:给定2n个整数a1,a2,,ana1,a2,…,an和m1,m2,,mnm1,m2,…,mn,求一个最小的非负整数x,满足i[1,n],xmi(mod ai)∀i∈[1,n],x≡mi(mod ai)。

思路:道题需要用到扩展欧几里德算法合并模线性方程组。由于这个题中所有的ai之间不一定能够保证两两互质,因而不满足中国剩余定理的条件,只能用扩展欧几里德算法对模线性方程组进行合并。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#include<queue>
#include<cmath>
#define ll long long
using namespace std;
ll n,a,b,c,d,c1,c2,x,y;
int exgcd(ll a,ll b,ll &x,ll &y){
    if (b==0){
        x=1;
        y=0;
        return a;
    }
    int d=exgcd(b,a%b,x,y);
    int z=x;x=y;y=z-y*(a/b);
    return d;
}
int main(){
    scanf("%lld",&n);
    scanf("%lld%lld",&a,&c1);
    int f=1;
    for (int i=1;i<n;i++)
    {
        scanf("%lld%lld",&b,&c2);
        d=exgcd(a,b,x,y);
        c=c2-c1;
        if (c%d) f=0;
        c/=d;
        ll t=b/d;
        x=((x*c)%t+t)%t;
        c1+=a*x;
        a=a/d*b;
    }
    if (c1<0) c1+=a;
    if (f) printf("%lld\n",c1);
    else printf("-1\n");
}

 

posted @ 2019-08-05 22:30  Ldler  Views(270)  Comments(0Edit  收藏  举报