https://www.nowcoder.com/acm/contest/201/C
题目描述
算术是为数不多的会让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
先利用GCD来判断不定方程是否有解,如果有解,将不定方程和带入方程
进行化简;
过程如下:
;
将y带入方程可得:
由抛物线的性质可知:方程的最小值在对称轴附近
由上式化简可知,抛物线的对称轴为:
然后在这条抛物线两边来找满足的整数解就可以了(即满足
),然后求两边满足要求的最小解就可以了
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int main()
{
ll a,b,c;
ll p1,p2,q1,q2,y;
scanf("%lld%lld%lld%lld%lld%lld%lld",&a,&b,&c,&p1,&p2,&q1,&q2);
ll gcd=__gcd(a,b);
if(c%gcd) puts("Kuon");
else{
ll aa=(a*a*q2+b*b*p2);
ll bb=b*b*p1-2*a*c*q2-a*q1*b;
ll x=(-bb)/(2*aa);
ll x1=x,x2=x;
while((c-a*x1)%b)//并不是每个x都满足条件
x1--;
y=(c-a*x1)/b;
ll ans1=p2*x1*x1+p1*x1+q2*y*y+q1*y;
while((c-a*x2)%b)
x2++;
y=(c-a*x2)/b;
ll ans2=p2*x2*x2+p1*x2+q2*y*y+q1*y;
printf("%lld\n",min(ans1,ans2));
}
}