CF689C Mike and Chocolate Thieves

题目大意

给定一个数 nn,求最小的 tt,使得存在恰好 nn 个不同的等比数列 a1,a2,a3,a4a_1,a_2,a_3,a_4,满足 1a1<a2<a3<a4t1\le a_1<a_2<a_3<a_4\le t

解题思路

设等比数列为 a1,a2,a3,a4a_1,a_2,a_3,a_4,其公比为 qq

则有 a4=a1q3a_4=a_1\cdot q^3

对于每个公比 qq,首项 a1a_1 可以从 11 开始取,其间只需满足 a4ta_4\le t,即 a1q3ta_1\cdot q^3\le t

通过移项可以得到 a1tq3a_1\le \dfrac{t}{q^3},所以 a1a_1 的值可以取 [1,tq3]\left [1,\left \lfloor \dfrac{t}{q^3} \right \rfloor \right ] 的所有正整数,

所以此时就有 tq3\left \lfloor \dfrac{t}{q^3} \right \rfloor 个满足条件的等比数列。

容易发现,nn 具有单调性,即 nn 会随着 tt 的变大而变大,又因为 nn 的范围为 [1,1015][1,10^{15}],所以考虑二分答案 tt

具体见代码。

CODE

#include <bits/stdc++.h>
using namespace std;

#define int long long

int n, l, r, mid, ans;

inline int check(int t)
{
    int q, cnt = 0;
    for (q = 2; q * q * q <= t; q++)
        cnt += t / (q * q * q);
    return cnt;
}

signed main()
{
    scanf("%lld", &n);
    l = 1;
    r = 1e18;
    while (l <= r)
    {
        mid = l + r >> 1;
        if (check(mid) >= n)
        {
            ans = mid;
            r = mid - 1;
        }
        else
            l = mid + 1;
    }
    if (check(ans) == n)
        printf("%lld", ans);
    else
        printf("-1");
    return 0;
}
posted @ 2021-10-31 13:25  蒟蒻orz  阅读(1)  评论(0编辑  收藏  举报  来源