POJ2891Strange Way to Express Integers
http://poj.org/problem?id=2891
实际上就是一个一元线性同余方程组。按照合并的方式来解即可。
有一个注意点,调用函数是会慢的。
#include#include #include using namespace std; typedef long long ll; ll t,a1,b1,a2,b2,x_0,y_0; ll ex_gcd(ll a,ll b,ll &x,ll &y) { if(!b){x=1,y=0;return a;} ll d=ex_gcd(b,a%b,x,y); ll tmp=x; x=y,y=tmp-a/b*y; return d; } int main() { while(~scanf("%lld",&t)) { bool ck=1; scanf("%lld%lld",&a1,&b1); t--; while(t--) { scanf("%lld%lld",&a2,&b2); ll a=a1,b=a2,c=b2-b1; ll d=ex_gcd(a,b,x_0,y_0); if(c%d) ck=0; ll t=b/d; x_0=(x_0*(c/d)%t+t)%t; b1=a1*x_0+b1; a1=a1*(a2/d); } if(!ck) printf("-1\n"); else printf("%lld\n",b1); } return 0; }