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;
 }