Description
学校要进行合唱比赛了,于是班主任小刘准备给大家排个队形。
他首先尝试排成m1行,发现最后多出来a1个同学;接着他尝试排成m2行,发现最后多出来a2个同学,……,他们尝试了n种排队方案,但每次都不能让同学们正好排成mi行。于是小刘寻求同事小明的帮助,以便给同学们排好队型。但小刘来去太匆忙,忘记告诉小明他们班有多少人了。没办法,现在只能根据上述信息求个满足要求的最小的数字来作为人数了。
虽然小明年轻时是理科生,但是他不愿意去思考这个问题;于是他找到了善于编程的你,希望你能通过编程来解决。
Input
第一行为一个整数n,表示小刘尝试了n种排队方案。
接下来n行,每行有两个整数mi,ai,表示小刘在第i种排队方案中,尝试让同学排成mi行,最后多出来ai个同学。
Output
每个输出文件只有一个整数,表示最少学生数,如果找不到这样的整数,说明小刘口误了,输出-1。
Sample Input
3
3 1
5 1
7 2
Sample Output
16
Data Constraint
Hint
对于100%的测试数据,满足n<=10,0
Code
#include <cstdio>
#include <iostream>
#include <cmath>/
#include <algorithm>
#define mo 1000000007
#define fo(i,a,b) for (int i=a;i<=b;i++)
using namespace std;
long long m[15],a[15];
int n;
long long Exgcd(long long a,long long b,long long &x,long long &y)
{
if (!b)
{
x=1;y=0;
return a;
}
long long d=Exgcd(b,a%b,x,y);
long long t=x;
x=y;
y=t-(a/b)*y;
return d;
}
long long CRT(long long a[],long long m[],int n)
{
long long M=1;
long long ans=0;
fo(i,1,n) M*=m[i];
fo(i,1,n)
{
long long x=0, y=0;
long long Mi=M/m[i];
Exgcd(Mi,m[i],x,y);
ans=(ans+Mi%M*x%M*a[i]%M+M)%M;
}
if(ans<0) ans+=M;
return ans;
}
int main()
{
freopen("data.in","r",stdin);
scanf("%d",&n);
fo(i,1,n)
{
if (i==1)
{
scanf("%lld%lld",&m[1],&a[1]);
continue;
}
scanf("%lld%lld",&m[i],&a[i]);
long long x=0,y=0;
long long c=a[i]-a[1],d=Exgcd(m[1],m[i],x,y);
if (c%d)
{
printf("-1\n");
return 0;
}
x*=(c/d);
x=((x%m[i])+m[i])%m[i];
a[1]=m[1]*x+a[1];
m[1]=m[1]/d*m[i];
a[1]=a[1]%m[1];
}
printf("%lld",a[1]);
}