• Codeforces Round #596 C. p-binaryC 暴力


    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.

    Examples

    input

    Copy

    24 0
    

    output

    Copy

    2
    

    input

    Copy

    24 1
    

    output

    Copy

    3
    

    input

    Copy

    24 -1
    

    output

    Copy

    4
    

    input

    Copy

    4 -7
    

    output

    Copy

    2
    

    input

    Copy

    1 1
    

    output

    Copy

    -1
    

    Note

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

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

    In the third sample case, we can represent 24=(24−1)+(22−1)+(22−1)+(22−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=(24−7)+(21−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.

    直接枚举答案即可

    我们发现如果答案存在 那么答案的值一定会很小 是不可能超过100的

    我们枚举之后可以理解为num=n-i*p然后只需要判断num是否可以用i个二进制数组成即可

    那么我们可以推出一个范围 i是否在 二进制1的个数和num之间即可

    #include<bits/stdc++.h>
    using namespace std;
    int main()
    {
        int n,p;
        scanf("%d%d",&n,&p);
        int ans=-1;
        for(int i=1;i<=100;i++)
        {
            int num=n-i*p;
            if(num<=0) break;
            int cnt=0;
            while(num)
            {
                if(num%2) cnt++;
                num/=2;
            }
            num=n-i*p;
            if(cnt<=i&&i<=num)
            {
                ans=i;
                break;
            }
        }
        printf("%d
    ",ans);
    }
  • 相关阅读:
    【TopCoder
    【TopCoder
    min_25筛学习笔记
    min_25筛学习笔记
    【SPOJ】 —DIVCNTK(min_25筛)
    【SPOJ】 —DIVCNTK(min_25筛)
    【UOJ#13 188】—Sanrd(min_25筛)
    【UOJ#13 188】—Sanrd(min_25筛)
    【BZOJ5244】【FJWC2018】—最大真因数(min_25筛)
    【BZOJ5244】【FJWC2018】—最大真因数(min_25筛)
  • 原文地址:https://www.cnblogs.com/caowenbo/p/11852201.html
Copyright © 2020-2023  润新知