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

Disclaimer: This article is a blogger original article, follow the CC 4.0 BY-SA copyright agreement, reproduced, please attach the original source link and this statement.
This link: 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.

 

 

Analysis: The simple observation of what you can find the final answer will not exceed logn, then direct violence enumerate it.

For an enumeration i, temp = ni * p, find all temp binary number 1, is the minimum number, is the maximum temp itself (all divided into 1), then as long as i in this range which can be a.

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

}

 

Guess you like

Origin blog.csdn.net/qq_42671946/article/details/102764395