新年度が始まり、寮生の宿泊問題が起こりました。そんな寮の1つに、a?×?b平方メートルのワンダールームがあります。管理人はちょうど n 人の生徒をそこに収容したいと考えています。しかし、法律では、1 つの部屋に生徒 1 人あたり少なくとも 6 平方メートルの面積がなければならないと定められています (つまり、n 人の生徒の部屋の面積は少なくとも 6n 平方メートルでなければなりません)。管理者は、部屋のいずれかの側 (おそらく両側) を任意の正の整数メートルだけ拡大できます。 n 人全員が住むことができ、部屋の総面積ができるだけ小さくなるように、部屋を変えるのを手伝ってください。
入力
最初の行には、スペースで区切られた 3 つの整数 n、a、b (1 ?≤?n,?a,?b?≤?109)?生徒の数と部屋の広さ。
出力
3 つの整数 s、a1、b1 (a?≤?a1; b?≤?b1) を出力します。部屋の最終的な面積とそのサイズ。最適解が複数ある場合は、いずれかを出力します。
サンプルテスト
入力
3 3 5
出力
183 6
入力
2 4 4
出力
164 4题意:安排宿舍大小,每个学生至少需要6平方米的大小,求n个学生,原本a*b大小的宿舍,再满足要求的情况下,新的宿舍由旧的宿舍扩建后的大小思路:搜索,起初10^9是过不了的,但是我们枚举一边a的大小后,对于另一边b,如果加一个条件我们起初设a<=b,那么再枚举到a>b的时候,等于说会出现对称的情况了,这样数据量就小一半了<pre name="code" class="n">#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>typedef long long ll;using namespace std;int main() { ll n, a, b; cin >> n >> a >> b; n *= 6; int flag = 0; if (a > b) { // 初始让x < y swap(a, b); flag = 1; } ll ans = 2000000000000000000ll;; ll nx = -1, ny = -1; for (ll i = 1; i <= n; i++) { ll x = i; ll y = (n + x - 1) / x; if (x > y) // 不符合,即出现对称 break; if (x < a) x = a; if (y < b) y = b; if (x * y < ans) { nx = x; ny = y; ans = x * y; } } if (flag) swap(nx, ny); cout << ans << endl; cout << nx << " " << ny << endl; return 0;}