Cod sursa(job #1000110)

Utilizator goguGogu Marian gogu Data 22 septembrie 2013 00:12:21
Problema Multiplu Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

#define MaxN 200100

int N, K, A[MaxN], B[MaxN];

bool HaveSol(const long long maxPrice) {
   long long nr = 0;
   for (int i = 0; i < N && nr < K; i++) {
      const long long pos = maxPrice - A[i];
      if (pos >= 0) {
         nr += pos / B[i] + 1;
      }
   }
   return K <= nr;
}

long long CheapestK(const long long maxPrice) {
   long long sum = 0, totalBuy = 0;
   for (int i = 0; i < N; i++) {
      const long long pos = maxPrice - A[i];
      if (pos >= 0) {
         long long nrBuy = pos / B[i] + 1;
         sum += nrBuy * A[i] + ((nrBuy * (nrBuy - 1)) / 2) * B[i];
         totalBuy += nrBuy;
      }
   }
   return sum - maxPrice * (totalBuy - K);
}

int main() {
   freopen("tarabe.in", "rb", stdin);
   freopen("tarabe.out", "wb", stdout);
   scanf("%d %d", &N, &K);
   for (int i = 0; i < N; i++) {
      scanf("%d %d", B + i, A + i);
   }
   long long st = 1, fn = 1ll << 40;
   while (st < fn) {
      long long mid = (st + fn) / 2;
      if (HaveSol(mid)) {
         fn = mid;
      } else {
         st = mid + 1;
      }
   }
   printf("%lld\n", CheapestK(st));
   return 0;
}