種類以上のお菓子を買うことは、いくつかのお菓子の値段の減少分を無駄にしてしまうため、考えなくてよいです。
よって、 種類のお菓子を購入するのが最適です。
それぞれのお菓子を 個購入したときの値段は等差数列の和の公式を利用すれば で高速に求められます。
したがって、この問題を全体で で解くことができました。
実装するときには、お菓子の値段が途中で となる場合に注意してください。
#include<bits/stdc++.h>
using namespace std;
int main(){
int n, k;
cin >> n >> k;
vector<long long> a(n), b(n);
for(int i = 0; i < n; i++){
cin >> a[i] >> b[i];
}
long long ans = 2e18;
for(int i = 0; i < n; i++){
long long cost = 0, count = (a[i] + b[i] - 1) / b[i];
if(k < count){
cost += k * (2 * a[i] + (k - 1) * -b[i]) / 2;
}else{
cost = count * (2 * a[i] + (count - 1) * -b[i]) / 2;
cost += (k - count);
}
ans = min(ans, cost);
}
cout << ans << endl;
}