2018年全国多校算法寒假训练营练习比赛(第三场)B.一个小问题(中国剩余定理)

链接:https://www.nowcoder.net/acm/contest/75/B
来源:牛客网

uu遇到了一个小问题,可是他不想答。你能替他解决这个问题吗?
问题:给你k对a和r是否存在一个正整数x使每队a和r都满足:x mod a=r,求最小正解x或无解。

输入描述:

第一行是正整数k(k<=100000)
接下来k行,每行有俩个正整数a,r(100000>a>r>=0)

输出描述:

在每个测试用例输出非负整数m,占一行。
如果有多个可能的值,输出最小的值。
如果没有可能的值,则输出-1。

示例1

输入

2
8 7
11 9

输出

31

中国剩余定理的非互素模板题
#include<iostream> 
#include<cstring> 
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long long LL;
LL exgcd(LL a,LL b,LL &x, LL &y)
{
  if(b==0)
  {
      x=1;
      y=0;
      return a;
  }
    LL r=exgcd(b,a%b,x,y);
    LL t=x;
    x=y;
    y=t-a/b*y;
    return r;
}
int main()
{
    LL flag=1;
    LL k,nowa,nowr,a,r,x,y,gc,ans,tmp;
    cin>>k;
    cin>>nowa;
    cin>>nowr;
    for(int i=2;i<=k;i++)
    {
        cin>>a>>r;
        if(flag==0)
        continue;
        gc=exgcd(nowa,-a,x,y);
        if((r-nowr)%gc!=0)
        {
            flag=0;
            continue;
        }
        x=x*(r-nowr)/gc;
        tmp=(-a)/gc;
        x=(x%tmp+tmp)%tmp;
        nowr=nowa*x+nowr;
        nowa=nowa*(-a)/gc;
    }
    if(flag==0)
    {
      puts("-1");
      return 0;
    }
    else
    {
        if(nowa<0)
        nowa=-nowa;
        ans=(nowr%nowa+nowa)%nowa;
        if(ans==0)
        ans+=nowa;
        cout<<ans<<endl;
    }
    return 0;
}

 



posted @ 2018-02-05 16:35  hinata_hajime  阅读(178)  评论(0编辑  收藏  举报