CF596C 最多隻用30次循環,一定能得到答案

/*
*/
#include<bits/stdc++.h>
using namespace std;
#define maxn 300010
#define ll long long
map<int,int> M;
int a[maxn];
int cal(ll x)
{
	int cnt=0;
	while(x)
	{
		cnt+=(x%2);
		x/=2;
	}
	return cnt;
}
int main()
{
	ios::sync_with_stdio(false);
//	cout<<((1ll<<30)-1)<<" "<<1000000000+1000*30;
	ll n,p;cin>>n>>p;
	int i;
	for(i=1;i<=30;i++)
	{
		ll N=n-i*p;
		int k=cal(N);
		if(k>i||i>N) continue;
		//當i>=30時,k一定是<=i的(i可以的表示範圍爲[i,2^i-1],N不會超過2^30-1,其實不止這些),所以第一個條件一定成立
		//如果當答案==31,說明i==30不符合條件,即N<30;並且i==31時,k<=i,即N>=31;條件矛盾
		//綜上i>=31一定不會構成解 
		cout<<i<<endl;break;
	}
	if(i==31) cout<<-1;
	return 0;
}

 

發佈了132 篇原創文章 · 獲贊 16 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章