【模板】【POJ2891】扩展中国剩余定理

来源:互联网 发布:moe域名在哪注册 编辑:程序博客网 时间:2024/06/03 11:01

exCRT适用于模数两两不互素的情况,思路是把方程两两合并即可,具体看这个博客吧:传送门

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>using namespace std;typedef long long LL;const int N=1005;int k;LL c[N],m[N];bool flag;LL gcd(LL a,LL b){    return b?gcd(b,a%b):a;}LL exgcd(LL a,LL b,LL &x,LL &y){    if(!b) {x=1;y=0;return a;}    else exgcd(b,a%b,y,x),y-=a/b*x;}LL inv(LL a,LL mod){    LL x,y;    exgcd(a,mod,x,y);    return (x%mod+mod)%mod;}LL exCRT(int k){    LL m1,m2,c1,c2,g;    for(int i=2;i<=k;i++)    {        m1=m[i-1],m2=m[i];        c1=c[i-1],c2=c[i];        g=gcd(m1,m2);        if((c2-c1)%g) {flag=0;return -1;}        m[i]=m1*m2/g;        c[i]=inv(m1/g,m2/g)*((c2-c1)/g)%(m2/g)*m1+c1;        c[i]=(c[i]%m[i]+m[i])%m[i];    }    return c[k];}int main(){    while(~scanf("%d",&k))    {        for(int i=1;i<=k;i++) scanf("%lld%lld",&m[i],&c[i]);        printf("%lld\n",exCRT(k));    }    return 0;}
原创粉丝点击