Submission #1203858

#TimeUsernameProblemLanguageResultExecution timeMemory
1203858LucaLucaMPacking Biscuits (IOI20_biscuits)C++20
100 / 100
50 ms1024 KiB
#include "biscuits.h"
#include <iostream>
#include <vector>
#include <algorithm>
#include <cassert>
#include <map>

#define debug(x) #x << " = " << x << '\n'
using ll = long long;

ll count_tastiness(ll X, std::vector<ll> a) {
  while ((int) a.size() < 62) {
    a.push_back(0);
  }

  std::vector<ll> sum(62, 0);
  sum[0] = a[0];
  for (int i = 1; i < 62; i++) {
    sum[i] = sum[i - 1];
    sum[i] += (ll) (1LL << i) * a[i];
  }

  std::map<ll, ll> memo;

  auto calc = [&](auto &&self, ll n) {
    if (memo.count(n)) {
      return memo[n];
    }
    if (n <= 0) {
      return 0LL;
    }
    ll b = std::__lg(n - 1);
    return memo[n] = self(self, (1LL << b)) + self(self, std::min(n, 1 + sum[b] / X) - (1LL << b));
  };

  memo[0] = 0;
  memo[1] = 1;
  return calc(calc, (ll) 2e18);
}

/*

daca X <= 1e4 ce fac?
ma uit la primii 15 biti sau cv

daca incepand cu al 20lea bit iau ceva != 0 => 

*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...