表达整数的奇怪方式
题意:给定2n个整数a1,a2,…,ana1,a2,…,an和m1,m2,…,mnm1,m2,…,mn,求一个最小的非负整数x,满足∀i∈[1,n],x≡mi(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"); }