#include "souvenirs.h"
#include <bits/stdc++.h>
using namespace std;
int n;
vector<int> bought;
vector<long long> p;
pair<vector<int>, long long> buy(long long coins)
{
  auto [ids, rem] = transaction(coins);
  for (int i : ids)
    bought[i]++;
  return {ids, coins - rem};
}
void go(long long maxP)
{
  auto [ids, cost] = buy(maxP);
  int curId = ids[0], sz = size(ids);
  for (int i = sz - 1; i; i--)
  {
    int id = ids[i];
    if (p[id] == 0)
      go(cost / (i + 1));
    cost -= p[id];
  }
  p[curId] = cost;
}
void buy_souvenirs(int N, long long p0) {
  n = N;
  bought.assign(n, 0);
  p.assign(n, 0);
  go(p0 - 1);
  for (int i = 1; i < n; i++)
  {
    assert(bought[i] <= i && p[i] > 0);
    while (bought[i] < i)
      buy(p[i]);
  }
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |