1. 集合 ( ) 必须包含 ( )(每个至少出现一次)。
  2. 集合中不能包含 ( k )。

即:存在k个不同的正整数 (),它们的出现次数 ( ) 是 () 的一个排列,并且所有 ()。

为了用最小的 m 实现 mex = k ,让大的出现次数配小的数字值,以最小化序列和。

最优分配方案: 数字 i 出现 k-i 次

这样序列和最小值为:

要使 mex 至少为 k ,必须满足:

即:

给定 m ,求最大的整数 k 满足上式。

#include <iostream>
#include<cmath>
using namespace std;

int main() {
    int T;
    cin>>T;
    while(T--){
        long long m,k;
        cin>>m;
        k=pow(6.0*m,1.0/3);
        while(k*k*k-k>6*m)k--;
        while((k+1)*(k+1)*(k+1)-(k+1)<=6*m)k++;
        cout<<k<<endl;
    }
    return 0;
}