一个小问题(中国剩余定理非互质版)

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld

题目描述

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

练习了一下非互质版本的中国剩余定理~~~附证明图片

一个小问题(中国剩余定理非互质版)_第1张图片
#include
#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define ll long long
#define INF 0x3f3f3f3f
using namespace std;

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;
    }
    ll r=exgcd(b,a%b,y,x);
    y-=a/b*x;
    return r;
}

ll inv(ll a,ll n)
{
    ll x,y;
    ll t=exgcd(a,n,x,y);
    if(t!=1)
        return -1;

    return (x%n+n)%n;
}

ll china(ll *m,ll *a,int n)
{
    ll M=1,ans=0;

    for(int i=0;i

你可能感兴趣的:(数论)