#扩欧#poj 2115 C Looooops

题目

一个变量初始值为a,每次加c,取除以 2 k 的余数,使它与b相等。


分析

这道题可以变一下 a + c x b ( m o d 2 k )
移项后变成 c x b a ( m o d 2 k )
没错,扩欧,具体解释懒得打。


代码

#include <cstdio>
using namespace std;
long long a,b,c,d,A,B,C,D,K,x,y;
long long exgcd(long long a,long long b,long long &x,long long &y){
    if (b==0) d=a,x=1,y=0;
    else exgcd(b,a%b,y,x),y=y-a/b*x;
}
int main(){
    while (scanf("%lld%lld%lld%lld",&A,&B,&C,&K)&&(A||B||C||K)){
        a=C; b=1ll<<K; c=B-A; exgcd(a,b,x,y);
        if (c%d!=0) puts("FOREVER");
        else{
            x*=(c/d);
            x=(x%(b/d)+(b/d))%(b/d);
            printf("%lld\n",x);
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/sugar_free_mint/article/details/80755067