JSP基礎教程:Beans and Forms處理
阿新 • • 發佈:2020-12-26
技術標籤:Codeforcesc++
C. p-binary
題意: 給n 和p 構造多個 (2^x + p) 這樣的數的和等於n 問最小多少個這樣的二進位制數
題解:
所以我們將 列舉t 即可
但是列舉的時候有個坑,有可能當前的二進位制值可能用多個
具體看程式碼
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e6+6;
ll n, p;
int main()
{
cin >> n >> p;
if(n <= p)
{
cout << -1 << endl;
return 0;
}
ll ans = -1;
ll ji = 0;
ll sum = 0;
for(int i = 1; i < 32; i ++) //列舉 因為1e9 最多是2的32次
{
ll cnt = 0; //這裡記錄當前sum值 有多少個1 也就是由多少個二進位制陣列成的
sum = n-p*i; // 根據公式減去
while(sum > 0) // 迴圈記錄有多少個1
{
if(sum&1) cnt ++;
sum >>= 1;
}
if( cnt <= i && i <= n-p*i ) // 這裡坑,如果剛好二進位制的數剛好
{ // 等於當前列舉的個數的時候
ans = i; // 當如果不等於的時候 我們可以知道
break; // 一個4+p 可以變成2+p+2+p
} // 所以如果當前列舉的個數不全為1的時候就可以, 雖然我覺得可以hack
}
cout << ans << endl;
return 0;
}