您的位置:首页 > 其它

poj 2115 扩展欧几里德

2013-07-25 20:03 260 查看
#include<stdio.h>

#include<string.h>

#define max 32

typedef long long LL;

LL pow2[max+5];

void init(){

for(int i=1;i<=max;i++){

pow2[i]=1LL<<i;

}

}

LL a,b,c,k;

void gcd(LL a,LL b,LL& d,LL& x,LL& y){

if(!b){

d=a; x=1; y=0; return;

}

gcd(b,a%b,d,y,x); y-=(a/b)*x;

}

int main(){

init();

while(scanf("%lld%lld%lld%lld",&a,&b,&c,&k)&&a+b+c+k!=0){

LL d,x,y;

if(a==b){

puts("0"); continue;

}

gcd(c,pow2[k],d,x,y);

if((b-a)%d){

puts("FOREVER");

}

else{

x=x*(b-a)/d;

x=(x%(pow2[k]/d)+(pow2[k]/d))%(pow2[k]/d);

printf("%lld\n",x);

}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: