10^12 とか 10^6 程度でどうこうできるだろうと見切り発車して後悔。意外と難敵。
ある工場か従業員を雇うなら可能な限り多く一度に増やすべき。
増やせない場合は、増やせるターンまで飛ばす。
それとは別に、これ以上増やさずにいったとして何ターンかかるかも計算しておく。
オーバーフローとか怖い。
もっと綺麗に実装できそう。
class StrongEconomy {
public:
long long earn(lli n, lli k, lli price, lli target)
{
lli ret = target;
lli gold = 0;
lli turn = 0;
while (true) {
++turn;
unless (n < k) swap(n, k);
const lli income = n * k;
if(k > target / n) {
ret = min(ret, turn);
break;
}
{ //
lli rest = target - gold;
ret = min(ret, (rest / income) + (bool)(rest % income) + turn - 1);
}
lli prev = gold;
gold += income;
if (gold < prev || target <= gold) {
ret = min(ret, turn);
break;
}
if (price <= gold) {
lli diff = k - n;
lli add = gold / price;
gold %= price;
if (add < diff) {
n += add;
} else {
n += diff;
add -= diff;
lli a = add / 2;
lli b = add - a;
n += b;
k += a;
}
} else {
lli next = max(0LL, ((price - gold) / income) - 2);
gold += next * income;
turn += next;
}
}
return ret;
}
};