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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_42671946/article/details/102764395

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;
    }

}

猜你喜欢

转载自blog.csdn.net/qq_42671946/article/details/102764395