牛客國慶集訓派對Day1 C Utawarerumono
阿新 • • 發佈:2018-12-13
時間限制: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; }