POJ

来源:互联网 发布:编程思维 编辑:程序博客网 时间:2024/05/29 08:17
#include<cstdio>using namespace std;/*扩展欧几里德(A+C*x)%(2^k)=BCx%(2^k)=B-A;Cx=(B-A)+(2^k)*y;Cx+(2^k)y=B-A*/typedef long long LL;void gcd(LL a,LL b,LL &d,LL &x, LL &y){    if(!b) {d=a;x=1;y=0;}    else{gcd(b,a%b,d,y,x);y-=x*(a/b);}}int main(){    LL A,B,C,k;    while(scanf("%lld %lld %lld %lld",&A,&B,&C,&k))    {        if(!A&&!B&&!C&&!k)            break;        LL d,x,y;        LL a=C;        LL b=1LL<<k;        LL c=B-A;        gcd(a,b,d,x,y);        if(c%d!=0)        {            printf("FOREVER\n");        }        else        {            b/=d;//d为gcd            c/=d;            x=(x*c%b+b)%b;//注意取模            printf("%lld\n",x);        }    }    return 0;}
原创粉丝点击