codeforcesの1247C

                ポータル: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 }

 

おすすめ

転載: www.cnblogs.com/sj-gank/p/11747718.html