链接:https://www.nowcoder.com/acm/contest/201/C
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 1048576K,其他语言2097152K
64bit IO Format: %lld
题目描述
算术是为数不多的会让Kuon感到棘手的事情。通常她会找Haku帮忙,但是Haku已经被她派去买东西了。于是她向你寻求帮助。
给出一个关于变量x,y的不定方程ax+by=c,显然这个方程可能有多个整数解。Kuon想知道如果有解,使得p2*x2+p1*x+q2*y2+q1*y最小的一组整数解是什么。为了方便,你只需要输出p2*x2+p1*x+q2*y2+q1*y的最小值。
输入描述
第一行三个空格隔开的整数a,b,c(0 ≤ a,b,c≤ 10^5)。 第二行两个空格隔开的整数p1,p2(1 ≤ p1,p2 ≤ 10^5)。 第三行两个空格隔开的整数q1,q2(1 ≤ q1,q2 ≤ 10^5)。
输出描述
如果方程无整数解,输出“Kuon”。 如果有整数解,输出p2*x2+p1*x+q2*y2+q1*y的最小值。
样例输入
2 2 1
1 1
1 1
1 2 3
1 1
1 1
样例输出
Kuon
4
解题思路
直接暴力解方程ax+by=c,求出p2*x2+p1*x+q2*y2+q1*y最小的那一个。考虑一些无解和其它的一些特殊情况,具体见代码:
#include <iostream>
#include <algorithm>
using namespace std;
const long long inf = 1e18;
long long p2, p1, q2, q1,a, b, c, d, xx, yy, minn;
long long gcd(long long a, long long b)
{
if (!b)
return a;
return gcd(b, a % b);
}
int main()
{
long long x, y, ans;
while (cin >> a >> b >> c >> p1 >> p2 >> q1 >> q2)
{
minn = inf;
d = gcd(a, b);
if (!a && !b && !c)
printf("0\n");
else if (!a && !b && c || c % d)
printf("Kuon\n");
else if (a && !b)
{
if (c % a)
printf("Kuon\n");
else
{
x = c / a;
ans = p2 * x * x + p1 * x;
cout << ans << endl;
}
}
else if (!a && b)
{
if (c % b)
printf("Kuon\n");
else
{
y = c / b;
ans = q2 * y * y + q1 * y;
cout << ans << endl;
}
}
else
{
for(int xi = -100000; xi <= 100000; xi++)
{
if((c - a * xi) % b == 0)
{
long long yi = (c - a * xi) / b;
ans = p2 * xi * xi + p1 * xi + q2 * yi * yi + q1 * yi;
minn = min(ans, minn);
}
}
cout << minn << endl;
}
}
return 0;
}