zoukankan      html  css  js  c++  java
  • 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;
        }
    }
    
  • 相关阅读:
    信息系统项目管理系列之十:项目人力资源管理
    信息系统项目管理系列之六:项目范围管理
    记大型商业软件<<国土档案管理信息系统>>之系统简介
    信息系统项目管理系列之九:项目质量管理
    ORACLE常见问题一千问(提供下载)(不怕学不成、就怕心不诚!)
    (推荐)(提供下载)ORACLE常见问题一千问(不怕学不成、就怕心不诚!)
    [推荐]ORACLE SQL:经典查询练手第四篇(不懂装懂,永世饭桶!)
    [顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功)
    [提供源码下载]在大型软件中用Word做报表:书签的应用(提供一种思路)
    (推荐一个超好的JS函数库)S.Sams Lifexperience ScriptClassLib
  • 原文地址:https://www.cnblogs.com/fusiwei/p/11752867.html
Copyright © 2011-2022 走看看