C Looooops [exgcd]

传送门

t*C-y*2^k=B-A


#include<bits/stdc++.h>
#define LL long long
using namespace std;
int A,B,C,k; LL x,y,gcd;
void exgcd(LL a,LL b){
	if(!b){x=1,y=0,gcd=a; return;}
	exgcd(b,a%b); LL x1=y,y1=x-a/b*y; x=x1,y=y1;
}
int main(){
	while(1){
		scanf("%d%d%d%d",&A,&B,&C,&k);
		if(A==0) break;
		if(A==B){printf("0\n"); continue;}
		LL b=(LL)1<<k,c=B-A,a=C;
		exgcd(a,b); if(c%gcd){printf("FOREVER\n"); continue;}
		x *= c/gcd; x %= (b/gcd); x = (x+b/gcd) % (b/gcd); printf("%lld\n",x);
	}return 0;
}

猜你喜欢

转载自blog.csdn.net/sslz_fsy/article/details/84891341