ポータル:https://codeforces.com/contest/1247/problem/C
あなたのトピックを与えることを意図:: n及びpされ、二人は「このようなシステムを持っていますバイナリ-P "(P + X ^ 2、Xは非負);あなたの最小数を使用する必要があります"P-バイナリ「N-和を表し、出力1を形成しません。
データサイズ:1 <= N <= 1E9; -100 <= p <= 100。
分析::
そのため1E9 <= 2 ^ 31、私たちは私だけに列挙する必要があります(1 <= iの<= 31)、問題の意味に従って式は、NI変形リリースすることができます* P ==Σ(2 ^ k)は、
組成物の重複仮定するN数は、繰り返しの数が多くに結合することができる代わりに、私は種の数を意味列挙する(小さなに分割数がその数は、増加する要件を満たさなければならない場合に)発生します回答は、NI *のP ^ 2であり、kに変換されるように、また限り最小数が必要とされる最小た<=私ができます。
1つの#include <ビット/ STDC ++ H> 2 の#define ULLのunsigned long長い 3 の#defineっ長い長 4 のconst int型 INF = 1E9 + 7 。 5 のconst int型 MAXN = 1E6 + 5 。 6 使用して 名前空間はstdを、 7 8 ブールチェック(LLのX、LLのY) 9 { 10 であれば(x <= 0 ) 11 リターン 0 。 12の LL ANS = xで、T = 0 。 13 一方(ANS)//組み合わせの最小数を見つける 14 { 15 IFを(ANS&1。 ) 16 T ++ ; 17の ANS / = 2 ; 18である } 。19 リターン Y> = T && X> = Y; // X> = Y 2 ^ kが1以上であるように、X種の構成数Y(そうでなければ設定されていない)よりも少なくとも大きい 20である } 21は、 INT (メイン) 22である { 23は LLのN-、P、ANS = - 1。; 24 scanfの(" %のLLDの%のLLD "、およびN-、&P); 25 用(INT I = 1 ; Iは= < 31であり ; Iを++) 26 { 27 であれば(チェック(ニッケル*のP、I)) 28 { 29 ANS = I。 30 ブレーク; 31 } 32 } 33 のprintf(" %LLDする\ n " 、ANS)。 34 リターン 0 。 35 }