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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

C. p-binary

time limit per test

2 seconds

memory limit per test

512 megabytes


standard input


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).


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


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.





#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;
        cout << ans << endl;