9511: Utawarerumono
时间限制: 1 Sec 内存限制: 128 MB
提交: 389 解决: 66
[提交] [状态] [讨论版] [命题人:admin]
题目描述
算术是为数不多的会让久远感到棘手的事情。通常她会找哈克帮忙,但是哈克已经被她派去买东西了。于是她向你寻求帮助。
给出一个关于变量x,y的不定方程ax+by=c,显然这个方程可能有多个整数解。久远想知道如果有解,使得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的最小值。
样例输入
2 2 1 1 1 1 1
样例输出
Kuon
来源/分类
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const long long INF = 0x3f3f3f3f3f3f3f3f;
void ex_gcd(ll a, ll b, ll &d, ll &x, ll &y)
{
if (!b)
{
x = 1; y = 0; d = a;
}
else
{
ex_gcd(b, a%b, d, y, x);
y -= x * (a / b);
}
}
int main(void)
{
int a,b,c,p1,p2,q1,q2;
scanf("%d%d%d%d%d%d%d",&a,&b,&c,&p1,&p2,&q1,&q2);
ll d,x,y;
ex_gcd(a,b,d,x,y);
if(c%d) return !puts("Kuon"); //无解
long long ans = INF;
if(a==b && a==0 && c) return !puts("Kuon"); //无解
else if(a==b && a==0 && c==a) return !puts("0"); //0
else if(a==0 && b) {
if(c%b) !puts("Kuon"); //没有整数解
y = c/b;
ans = q2*y*y + q1*y;
return !printf("%lld\n",ans);
}
else if(a && b==0 ) {
if(c%a) !puts("Kuon");
x = c/a;
ans = p2*x*x + p1*x ;
return !printf("%lld\n",ans);
}
for(x=-(int)1e4;x<=(int)1e5;x++)
{
if((c - a*x)%b) continue;
y = (c - a*x)/b;
long long t = p2*x*x+p1*x+q2*y*y+q1*y;
ans = min(ans,t);
}
return !printf(ans==INF?"Kuon\n":"%lld\n",ans);
}
/**************************************************************
Language: C++
Result: 正确
Time:4 ms
Memory:1700 kb
****************************************************************/