cf#361-C - Mike and Chocolate Thieves-二分

微笑


有4个贼,他们共用一个容量为n的背包,他们偷的东西量为等比数列,即 a,aq,aq2,aq3

要求aq^3<=N;

给出 a与q的组合方案恰为m,求出最大的N



解法:二分N,对每个N的判断如下:  枚举q,while(q*q*q<=n),则说明这个是可行的,那么对应多少个a呢,就是N/q/q/q个,统计看当前的N对应的方案与m比较,最后判断一下-1

即当 二分得到的N的方案数==m,则可行,否则说明该方案不存在





#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <iostream>
using namespace std;

const double pi=acos(-1.0);
double eps=0.000001;

long long  bin( long long  x)
{
    long long ret=0;
    for (int  i=1;  ; i++)
    {
        long long j=i+1;
        long long tmp=j*j*j;
        if (tmp>x) break;
        ret+=x/tmp;
    }
    return ret;
}
long long ans=0;
long long work( long long m)
{
    long long  l=1;
    long long  r=1e16;
    long long  ans=0;
    while(l<=r)
    {
        long long  mid=(l+r)>>1;
        if (bin(mid)>=m )
            r=mid-1  ,ans=mid;
        else
            l=mid+1	;
    }
    return ans;
}
int main()
{
    long long m;
    scanf("%lld",&m);
    long long ans=work(m);

    if (m==bin(ans))
        printf("%lld\n",ans);
    else
        printf("-1\n");








    return 0;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值