您的位置:首页 > 运维架构

POJ - 2115 Looooops(扩展欧几里得)

2018-01-29 17:37 288 查看
求解Cx+pow(2,k)y=(B-A) 是否存在解,如果存在输出最小正整数解x类似于poj1061,直接用扩展欧几里得即可

#include <stdio.h>
#include <iostream>
#include <string.h>
#include <algorithm>
#include <math.h>
using namespace std;
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(cin>>A>>B>>C>>K)
{
if(A==0&&B==0&&C==0&&K==0) break;
ll a=C;
ll b=pow(2,K);
ll c=B-A;

//printf("%d %d\n",a,b);
ll ans,x,y;

gcd(a,b,ans,x,y);

if(c%ans==0)
{
x=x*c/ans;
y=y*c/ans;
//printf("%lld*%lld+%lld*%lld=%lld\n",a,x,b,y,c);
ll b1=b/ans;
if(x<0)
{
if(-x%b1==0)
x=0;
else
x=x+(-x/b1+1)*b1;
//printf("x=%lld %lld\n",x,b1);
}

if(x>b1)
{
if(x%b1==0) x=0;
else
x=x-(x/b1*b1);
}
printf("%lld\n",x);
}
else printf("FOREVER\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: