题目链接---B-一个小问题
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
题目描述
uu遇到了一个小问题,可是他不想答。你能替他解决这个问题吗?
问题:给你k对a和r是否存在一个正整数x使每队a和r都满足:x mod a=r,求最小正解x或无解。
问题:给你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<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long int
#define MAX 100000+10
using namespace std;
long long a[MAX],r[MAX];
long long exgcd(ll a,ll b,ll &x,ll &y)
{
if(b==0)
{
x=1;
y=0;
return a;
}
ll res=exgcd(b,a%b,y,x);
y=y-x*(a/b);
return res;
}
long long solve(ll a[],ll b[],ll n)
{
for(int i=1;i<n;i++)
{
ll x,y;
ll c=r[i]-r[i-1];
ll gcd=exgcd(a[i-1],a[i],x,y);
if(c%gcd!=0)
return -1;
else
{
ll t=a[i]/gcd;
x=(x*(c/gcd)%t+t)%t;
r[i]=a[i-1]*x+r[i-1];
a[i]=a[i-1]*(a[i]/gcd);
}
}
return r[n-1];
}
int main()
{
ll n;
while(cin>>n)
{
for(int i=0;i<n;i++)
{
cin>>a[i]>>r[i];
}
long long ans=solve(a,r,n);
cout<<ans<<endl;
}
return 0;
}