CodeForces - 1247C p-binary 【思維】

題目鏈接:https://codeforces.com/problemset/problem/1247/C

題意:給你兩個數n和p, 讓你將n分解成最少的二進制位,但是二進制位變成了2^x  + p, 例如當n = 24,p = 1時,

思路:不難想到n在二進制分解後絕對不會超過40位,所以對於這麼小的範圍我們就暴力枚舉多少位能夠組成n就行了。

但是有可以重複用某一位的情況,所以還需要記錄一下可以拆分多少位,如果夠的話就說明可以。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define ls rt << 1
#define rs rt << 1|1
#define mid ((l + r) >> 1)
#define lson l, mid, ls
#define rson mid + 1, r, rs
const int maxn = 2e5 + 10;
const int mod = 1e9 + 7;

int main()
{
    ll n, p;
    cin >> n >> p;
    int ans = -1;
    for(int i = 1; i <= 40; ++i)
    {
        ll tmp = n - 1ll * i * p;
        int cnt = 0, tot = 0;
        if(tmp > 0)
        {
            for(int j = 40; j >= 0; --j)
            {
                if(tmp & (1ll << j))
                {
                    ++cnt;
                    if(j > 0)
                        tot += j - 1;
                }
            }
            if(cnt == i)
            {
                ans = cnt;
                break;
            }
            else if(cnt < i)
            {
                if(cnt + tot >= i)
                {
                    ans = i;
                    break;
                }
            }
        }
    }
    cout << ans << endl;
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章