mathematical formula:

四面体数

也叫三角锥体数是可以排成底为三角形的锥体(即四面体)的数。四面体数每层为三角形数,其公式是首n个三角形数之和,即

n(n+1)(n+2)/6​

其首几项为:1, 4, 10, 20, 35, 56, 84, 120.

(1) 先在vector里标记每个i对应的vec[i];即vec[i]为排列[1,i]存在时的最小数;

vec[i]=(1,2,3,...,i)(i,i-1,i-2,...,1)=i(i+1)(i+2)/6;

(2) 找出n所属的i;即vec[i-1] <= n <vec[i]; i+1为排列的mex值;

ll binarys(ll n, vector<ll>& vec) {//拷贝极花时间,记得加引用;
    ll left = 1; ll right = 2000000;
    while (left <= right) {
        ll middle = (left + right) / 2;
        if (vec[middle] > n)right = middle - 1;
        else left = middle + 1;
    }
    return left;//用二分直接取出i+1;
}
void solve() {
    vector<ll> vec(2000001);
    for (ll l = 1; l <= 2000000; l++) {
        vec[l] = l * (l + 1) * (l + 2) / 6;//(1)
    }
    int t; cin >> t;
    while (t--) {
        ll n; cin >> n;
        cout << binarys(n, vec)<<endl;//(2) 
    }