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