CF1225C p-binary

CF1225C p-binary

洛谷评测传送门

题目描述

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 2^x + 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=2^0-9−8=20−9 , 7=2^4-97=24−9 , 1015=2^{10}-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 2^0 + 2^1 + 2^220+21+22 .

And if p=-9p=−9 we can represent 77 as one number (2^4-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 leq n leq 10^91≤n≤109 , -1000 leq p leq 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.

输入输出样例

输入 #1复制

输出 #1复制

输入 #2复制

输出 #2复制

输入 #3复制

输出 #3复制

输入 #4复制

输出 #4复制

输入 #5复制

输出 #5复制

说明/提示

00 -binary numbers are just regular binary powers, thus in the first sample case we can represent 24 = (2^4 + 0) + (2^3 + 0)24=(24+0)+(23+0) .

In the second sample case, we can represent 24 = (2^4 + 1) + (2^2 + 1) + (2^0 + 1)24=(24+1)+(22+1)+(20+1) .

In the third sample case, we can represent 24 = (2^4 - 1) + (2^2 - 1) + (2^2 - 1) + (2^2 - 1)24=(24−1)+(22−1)+(22−1)+(22−1) . Note that repeated summands are allowed.

In the fourth sample case, we can represent 4 = (2^4 - 7) + (2^1 - 7)4=(24−7)+(21−7) . Note that the second summand is negative, which is allowed.

In the fifth sample case, no representation is possible.

题解:

对于一个给定的(n,p),试求一个最小的(k),使得存在:

[sum_{i=1}^{k}{(2^{a_i}+p)} ]

那么对于题意,我们很容易发现,这个数就是多加了(i)(p),如果把这(i)(p)去掉,那么就显然可以把这个数(n-i imes p)进行二进制拆分,拆成很多个二的整数次幂之和,我们要求出这个最小的加数数量。

根据二进制拆分的原则,我们把这个数(n-i imes p)用二进制表示,其中有(1)对应的第(i)位就是(2^{i-1})(根据位运算的性质)。

那么,我们算出来这个数(n-i imes p)的二进制表示中1的个数,如果这个个数比(i)大,那么就不合法(这是显然的)。并且,如果(n-i imes p<i),那么也不合法。

那么我们从小到大枚举,判断一下即可。

如有对lowbit运算不太了解的同学,可参考本蒟蒻的这篇博客:

浅谈lowbit运算

代码:

#include<cstdio>
using namespace std;
int n,p,ans,flag;
int lowbit(int x)
{
    int ret=0;
    while(x)
    {
        x-=x&-x;
        ret++;
    }
    return ret;
}
int main()
{
    scanf("%d%d",&n,&p);
    for(int i=1;;i++)
    {
        if(n-i*p<i)
            break;
        if(lowbit(n-i*p)>i)
            continue;
        ans=i;
        flag=1;
        break;
    }
    if(flag)
    {
        printf("%d",ans);
        return 0;
    }
    else
    {
        printf("-1");
        return 0;
    }
}
原文地址:https://www.cnblogs.com/fusiwei/p/11752867.html