poj2891 Strange Way to Express Integers

    xiaoxiao2021-03-25  95

    链接

      http://poj.org/problem?id=2891

    题解

      模板,现在还不理解,背过就好了...只知道它能求模线性方程组

    代码

    //中国剩余定理 #include <cstdio> #include <algorithm> #define maxn 100000 #define ll long long using namespace std; ll a[maxn], m[maxn], N; void exgcd(ll a, ll b, ll &x, ll &y) { if(!b){x=1,y=0;return;} ll xx, yy; exgcd(b,a%b,xx,yy); x=yy, y=xx-a/b*yy; } ll gcd(ll a, ll b){return !b?a:gcd(b,a%b);} ll lcm(ll a, ll b){return a/gcd(a,b)*b;} ll CRT(ll *a, ll *m, ll n) { ll a1, m1, a2, m2, d, x1, x2; a1=a[1], m1=m[1]; for(ll i=2;i<=n;i++) { a2=a[i], m2=m[i]; d=gcd(m1,m2); if((a2-a1)%d!=0)return -1; exgcd(m1,m2,x1,x2); x1=(a2-a1)/d*x1%m2; a1=(a1+x1*m1)%lcm(m1,m2); m1=lcm(m1,m2); } return (a1+m1)%m1; } int main() { ll i, N; while(~scanf("%lld",&N)) { for(i=1;i<=N;i++)scanf("%lld%lld",m+i,a+i); printf("%lld\n",CRT(a,m,N)); } return 0; }
    转载请注明原文地址: https://ju.6miu.com/read-15579.html

    最新回复(0)