POJ 2115 C Looooops

题目描述

题目要求就是求满足A+C*x≡B mod 2^k,移向得C*x≡B-A mod 2^k,这也就变成了求解同余方程的问题,即求满足C*x+2^k*y=B-A的x和y。

类似于 青蛙的约会 那道题,令a=C,b=2^k,r=Gcd(a,b),扩展欧几里得算法求的是满足ax+by=gcd(a,b)的解,

所以最后的答案为x*(c/r)%(b/r)。

#include<complex>
#include<cstdio>
using namespace std;
long long a,b,c,x,y;
long long qread()
{
    long long x=0;
    char ch=getchar();
    while(ch<'0' || ch>'9')ch=getchar();
    while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x;
}
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 r=Exgcd(b,a%b,x,y),tmp=x;
    x=y;y=tmp-a/b*y;
    return r;
}
int main()
{
    long long x1,x2;
    while(1)
    {
        x1=qread();x2=qread();a=qread();b=qread();
        if(x1+x2+a+b==0)break;
        b=1ll<<b;
        long long r=Exgcd(a,b,x,y),c=x2-x1;
        if(c%r)
        {
            puts("FOREVER");
            continue;
        }
        printf("%lld\n",(x*(c/r)%(b/r)+b/r)%(b/r));
    }
    return 0;
}

 

posted @ 2018-05-20 20:11  LeTri  阅读(220)  评论(2编辑  收藏  举报