• 【POJ2891】Strange Way to Express Integers


    题意

    有一个数x,x%ai = ri ,给出n对ai和ri,问x的最小非负整数是什么,如果不存在输出-1

    分析

    ai不互质的中国剩余定理--->扩展中国剩余定理

    我已经放弃看懂证明了

    直接上构造公式

    代码

    #include<bits/stdc++.h>
    using namespace std;
    #define N 1000010
    #define ll long long
    ll n,x,y,ans,flag;
    ll c[N],m[N];
    inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
    inline ll exgcd(ll a,ll b,ll &x,ll &y)
    {
        if(b==0)
        {
            x=1,y=0;
            return a;
        }
        ll ret=exgcd(b,a%b,x,y);
        ll t=x;x=y,y=t-(a/b)*y;
        return ret;
    }
    inline ll inv(ll a,ll b){ll tmp=exgcd(a,b,x,y);return x=(x%b+b)%b;} 
    int main()
    {
        while(scanf("%lld",&n)==1)
        {
            for(ll i=1;i<=n;i++)scanf("%lld%lld",&m[i],&c[i]);
            flag=1;
            for(ll i=2;i<=n;i++)
            {
                ll c1=c[i-1],m1=m[i-1],c2=c[i],m2=m[i],d=gcd(m1,m2);
                if((c2-c1)%d){flag=0;break;}
                m[i]=(m1*m2)/d;
                c[i]=(inv(m1/d,m2/d)*(c2-c1)/d)%(m2/d)*m1+c1;
                c[i]=(c[i]%m[i]+m[i])%m[i];
            }
            printf("%lld
    ",flag?c[n]:-1);    
        }
        return 0;
    }

     

  • 相关阅读:
    JVM内存模型
    052-224(新增70题2018)
    052-223(新增70题2018)
    052-222(新增70题2018)
    052-221(新增70题2018)
    052-220(新增70题2018)
    052-219(新增70题2018)
    052-218(新增70题2018)
    052-217(新增70题2018)
    052-216(新增70题2018)
  • 原文地址:https://www.cnblogs.com/NSD-email0820/p/9911636.html
Copyright © 2020-2023  润新知