Codeforces Round #596 (Div. 2, based on Technocup 2020 Elimination Round 2)C - p-binary【暴力】

C. p-binary

time limit per test

2 seconds

memory limit per test

512 megabytes

input

standard input

output

standard output

Vasya will fancy any number as long as it is an integer power of two. Petya, on the other hand, is very conservative and only likes a single integer pp (which may be positive, negative, or zero). To combine their tastes, they invented pp-binary numbers of the form 2x+p2x+p, where xx is a non-negative integer.

For example, some −9−9-binary ("minus nine" binary) numbers are: −8−8 (minus eight), 77 and 10151015 (−8=20−9−8=20−9, 7=24−97=24−9, 1015=210−91015=210−9).

The boys now use pp-binary numbers to represent everything. They now face a problem: given a positive integer nn, what's the smallest number of pp-binary numbers (not necessarily distinct) they need to represent nn as their sum? It may be possible that representation is impossible altogether. Help them solve this problem.

For example, if p=0p=0 we can represent 77 as 20+21+2220+21+22.

And if p=−9p=−9 we can represent 77 as one number (24−9)(24−9).

Note that negative pp-binary numbers are allowed to be in the sum (see the Notes section for an example).

Input

The only line contains two integers nn and pp (1≤n≤1091≤n≤109, −1000≤p≤1000−1000≤p≤1000).

Output

If it is impossible to represent nn as the sum of any number of pp-binary numbers, print a single integer −1−1. Otherwise, print the smallest possible number of summands.

 

 

分析:简单观察一下就可以发现最终答案不会超过logn,那么直接暴力枚举就可以了。

对于一个枚举i,temp=n-i*p,找出temp二进制中1个个数,就是个数的最小值,最大值就是temp本身(全部分为1),那么只要i在这个范围里面就可以了。

#include <bits/stdc++.h>

using namespace std;

int main() {
    long long n, p;
    while(cin >> n >> p){
        int ans = -1;
        for (int i = 1; i <= 34; ++i) {
            long long temp = n - i * p;
            if (temp < 0)break;
            int num = 0;
            while (temp) {
                if (temp & 1)num++;
                temp >>= 1;
            }
            if (i <= n - i * p && i >= num) {
                ans = i;
                break;
            }
        }
        cout << ans << endl;
    }

}

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值