[题解]P2810 Catch the theives

简化版题意

有一个四元组:\((x,xk,xk ^ 2,xk ^ 3)\) 满足以下条件:

  1. \(k > 1\)
  2. \(x \leq m\)
  3. \(xk \leq m\)
  4. \(xk ^ 2 \leq m\)
  5. \(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;  
}  
posted @ 2024-06-26 12:34  WBIKPS  阅读(15)  评论(0)    收藏  举报