[题解]P2810 Catch the theives
简化版题意
有一个四元组:\((x,xk,xk ^ 2,xk ^ 3)\) 满足以下条件:
- \(k > 1\)
- \(x \leq m\)
- \(xk \leq m\)
- \(xk ^ 2 \leq m\)
- \(xk ^ 3 \leq m\)
现在给定满足条件的四元组的个数 \(n\),求:最小的 \(m\) 是多少?
思路
\(\because x \leq xk \leq xk ^ 2 \leq xk ^ 3 \leq m\)
\(\therefore \text{满足条件的四元组只与} xk ^ 3 \text{有关}\)
我们的 \(f\) 函数,就可以枚举 \(k\),那么对于每一个合法的 \(xk ^ 3\),那么它的贡献为 \(\lfloor \frac{m}{k ^ 3} \rfloor\)。
此时,我们可以用上二分答案的方法,来枚举 \(m\)。
但是,这题的答案很奇怪,它是求满足条件 \(m\) 的最小值。
因此,我们可以求出方案数小于 \(n\) 的最大的 \(m\),然后判断一下 \(m + 1\) 的方案数是否等于 \(n\)。
如果是直接输出 \(m + 1\),否则输出 -1。
Code
#include <bits/stdc++.h>
#define int long long
using namespace std;
int n,ans;
int f(int x){
int res = 0;
for (int i = 2;i * i * i <= x;i++) res += x / (i * i * i);//枚举 k 算出方案数
return res;
}
signed main(){
cin >> n;
int l = 1;
int r = 5e15 + 10;
while (l <= r){//二分模板
int mid = l + r >> 1;
if (f(mid) < n){
ans = mid;
l = mid + 1;
}
else r = mid - 1;
}
if (f(ans + 1) == n) cout << ans + 1;//判断
else puts("-1");
return 0;
}

浙公网安备 33010602011771号