链接: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≤ 105)。 第二行两个空格隔开的整数p1,p2(1 ≤ p1,p2 ≤ 105)。 第三行两个空格隔开的整数q1,q2(1 ≤ q1,q2 ≤ 105)。
输出描述:
如果方程无整数解,输出“Kuon”。 如果有整数解,输出p2*x2+p1*x+q2*y2+q1*y的最小值。
示例1
输入
复制
2 2 1 1 1 1 1
输出
复制
Kuon
示例2
输入
复制
1 2 3 1 1 1 1
输出
复制
4
题解:用的暴力枚举,写错了好多次,终于该正确了,写得有点丑。
#include <stdio.h>
#include <algorithm>
#include <iostream>
#include <cstring>
using namespace std;
const int maxn = 1000000;
int main()
{
long long a,b,c,p1,p2,q1,q2;
long long ans;
scanf("%lld %lld %lld",&a,&b,&c);
scanf("%lld %lld",&p1,&p2);
scanf("%lld %lld",&q1,&q2);
if(a == 0 && b == 0)
{
if(c == 0)
{
long long cnt1 = 0,cnt2 = 0;
for(int i = -maxn;i <= maxn;i++)
{
cnt1 = min(cnt1,p1 * i + p1 * i * i);
cnt2 = min(cnt2,q1 * i + q1 * i * i);
printf("%lld\n",cnt1 + cnt2);
}
}
else printf("Kuon\n");
return 0;
}
else if(a == 0)
{
if(c % b == 0)
{
long long cnt = c / b;
ans = q1 * cnt + q2 * cnt * cnt;
for(int i = -maxn;i <= maxn;i++)
{
ans = min(ans,i * p1 + i * i * p2 + q1 * cnt + q2 * cnt * cnt);
}
printf("%lld\n");
}
else
{
printf("Kuon\n");
}
return 0;
}
else if(b == 0)
{
if(c % a == 0)
{
long long cnt = c / a;
ans = p1 * cnt + p2 * cnt * cnt;
for(int i = -maxn;i <= maxn;i++)
{
ans = min(ans,i * q1 + i * i * q2 + p1 * cnt + p2 * cnt * cnt);
}
printf("%lld\n");
}
else
{
printf("Kuon\n");
}
return 0;
}
int flag = 0;
for(int i = -maxn;i <= maxn;i++)
{
if((c - a * i) % b != 0) continue;
long long cnt = (c - a * i) / b;
if(flag == 0)
{
flag = 1;
ans = p2 * i * i + p1 * i + q2 * cnt * cnt + q1 * cnt;
}
else ans = min(ans,p2 * i * i + p1 * i + q2 * cnt * cnt + q1 * cnt);
}
if(flag == 0) printf("Kuon\n");
else printf("%lld\n",ans);
return 0;
}