您的位置:首页 > 编程语言 > C语言/C++

poj2115(扩展欧几里得)

2015-05-21 08:51 267 查看
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
typedef __int64 ll;
ll exgcd(ll a,ll b,ll &x,ll &y)
{
ll d;
if(b==0)
{
x=1;y=0;
d=a;
}
else
{
d=exgcd(b,a%b,y,x);
y-=(a/b)*x;
}
return d;
}
ll Abs(ll a)
{
if(a<0) return -a;
return a;
}
int main()
{
//freopen("in.txt","r",stdin);
ll a,b,c,k;
while(scanf("%I64d%I64d%I64d%I64d",&a,&b,&c,&k),a||b||c||k)
{
ll x,y;
k=(1ll<<k);
ll d=exgcd(k,c,x,y);   //这里的(x,y)为kx+cy=gcd(k,c)的解
if((b-a)%d==0)
{
ll e=(b-a)/d*y%k+k;
cout<<e%(k/d)<<endl;
}
else
cout<<"FOREVER"<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ 算法 数学