pku 2115 C Looooops(线性同余方程)

#include <stdio.h>

 

typedef long long LL;

LL ext_gcd(LL a,LL b,LL &x,LL &y)
{
    if(!b)
    {
        x = 1;
        y = 0;
        return a;
    }
    LL g = ext_gcd(b,a%b,x,y);
    LL t = x;
    x = y;
    y = t - a/b * y;
    return g;
}

inline LL _abs(LL x)
{
    return x > 0 ? x : -x;
}
bool solve(LL a,LL c,LL m)
{
    LL g,x,y;
    g = ext_gcd(a,m,x,y);
    if( c % g ) return false;
    x = ( c/g * x ) % m;
    x %= _abs(m/g);
    if(x < 0) x += _abs(m/g);
    printf("%I64d\n",x);
    return true;
}

int main()
{
#ifndef ONLINE_JUDGE
    freopen("tdata.txt","r",stdin);
#endif
    LL A,B,C,M;
    int k;
    while( scanf("%I64d %I64d %I64d %d",&A,&B,&C,&k),(A+B+C+k) )
    {
        M = (LL)1 << k;
        B -= A;
        if( ! solve(C, B, M) ) printf("FOREVER\n");
    }
    return 0;
}

posted @ 2010-09-15 16:55  菜到不得鸟  阅读(185)  评论(0)    收藏  举报