扩展欧几里得算法,给出a,b, c 求满足a * x + b * y = c 且 a >= 0, b >= 0, a + b 最小。注意格式问题,因为格式wa了无数遍。。。汗。。。
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<fstream>
#include<sstream>
#include<vector>
#include<string>
#include<bitset>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<set>
#define CLR(a, b) memset(a, b, sizeof(a))
#define debug puts("**debug**")
#define PB push_back
#define LL long long
using namespace std;
LL gcd(LL a, LL b)
{
return b == 0 ? a : gcd(b, a % b);
}
void E_gcd(LL a, LL b, LL &d, LL& x, LL& y)
{
if(!b)
{
d = a;
x = 1, y = 0;
}
else
{
E_gcd(b, a % b, d, y, x);
y -= x*(a / b);
}
}
int main()
{
// freopen("input.txt", "r", stdin);
LL x, y, a, b, c, d, t;
while(cin >> a >> b >> c, a + b + c)
{
LL g = gcd(a, b);
if(c % g)cout << "Unquibable!" << endl;
else
{
a /= g;
b /= g;
c /= g;
E_gcd(a, b, d, x, y);
t = c % b;
x %= b;
x = (x * t) % b;
x = (x + b) % b;
y = (c - (x * a)) / b;
if(y<0)
{
printf("Unquibable!\n");
continue;
}
if(x==1)
{
if(y==1)
{
printf("1 foom and 1 foob");
}
else
{
printf("1 foom and %lld foobs",y);
}
}
else
{
if(y==1)
{
printf("%lld fooms and 1 foob",x);
}
else
{
printf("%lld fooms and ",x);
printf("%lld foobs",y);
}
}
printf(" for a twob!\n");
}
}
return 0;
}