猪的安家
Accept: 861 Submit: 5476
Time Limit: 1000 mSec Memory Limit : 32768 KB
Problem Description
Andy和Mary养了很多猪。他们想要给猪安家。但是Andy没有足够的猪圈,很多猪只能够在一个猪圈安家。举个例子,假如有16头猪,Andy建了3个猪圈,为了保证公平,剩下1头猪就没有地方安家了。Mary生气了,骂Andy没有脑子,并让他重新建立猪圈。这回Andy建造了5个猪圈,但是仍然有1头猪没有地方去,然后Andy又建造了7个猪圈,但是还有2头没有地方去。Andy都快疯了。你对这个事情感兴趣起来,你想通过Andy建造猪圈的过程,知道Andy家至少养了多少头猪。
Input
输入包含多组测试数据。每组数据第一行包含一个整数n (n <= 10) – Andy建立猪圈的次数,解下来n行,每行两个整数ai, bi( bi <= ai <= 1000), 表示Andy建立了ai个猪圈,有bi头猪没有去处。你可以假定(ai, aj) = 1.
Output
输出包含一个正整数,即为Andy家至少养猪的数目。
Sample Input
33 15 17 2
Sample Output
16
解线性同余方程组的最小值。
#include<stdio.h>
__int64 a,b,c,a1,a2,r1,r2,x,y,k;
__int64 exgcd(__int64 A,__int64 &x,__int64 B,__int64 &y)
{
__int64 x1,y1,x0,y0;
x0=1;
y0=0;
x1=0;
y1=1;
__int64 r=(A%B+B)%B;
__int64 q=(A-r)/B;
x=0;
y=1;
while(r)
{
x=x0-q*x1;
y=y0-q*y1;
x0=x1;
y0=y1;
x1=x;
y1=y;
A=B;
B=r;
r=A%B;
q=(A-r)/B;
}
return B;
}
__int64 solve()
{
bool flag=1;
scanf("%I64d%I64d",&a1,&r1);
for(__int64 i=1; i<k; i++)
{
scanf("%I64d%I64d",&a2,&r2);
a=a1;
b=a2;
c=r2-r1;
__int64 d=exgcd(a,x,b,y);
if(c%d!=0)
{
flag=0;
}
__int64 t=b/d;
x=(x*(c/d)%t+t)%t;
r1=a1*x+r1;
a1=a1*(a2/d);
}
if(!flag)return -1;
return r1;
}
int main()
{
while(scanf("%I64d",&k)!=EOF)
{
printf("%I64d\n",solve());
}
return 0;
}