ブルーブリッジカップかなりの数K(DP)

 

説明
隣接する2つの数字のKバイナリ表現の自然数Nが隣接していない場合、我々はKがかなりの数の数であると言います。要件Lの桁の16進K K.のかなりの数の数 例えばK = 4、L = 2時間、7 11,13,20,22,30,31,33のすべての良い数K用。このため、多数の、剰余1000000007後の出力値をしてください。
入力
入力は、2つの正の整数、KおよびL.が含まれています
出力
剰余1000000007への回答を表す出力整数値。
サンプル入力
4 2
 
サンプル出力
7
 
ヒント
データサイズと一致した

データの30%、KL <= 106;

データの50%、K <= 16、L < = 10;

データの100%が、1 <= K、L < = 100。

 

 

アイデア:

私はいくつかの数字で表されている場合、DP [i] [j]は、jのjは、いくつかの第1の放電の代表であります

 

1の#include <stdio.hの>
 2の#include < ストリング・H>
 3の#include <iostreamの>
 4の#include < ストリング >
 5の#include <math.h>の
 6の#include <アルゴリズム>
 7の#include <ベクトル>
 8#含む<スタック>
 9の#include <キュー>
 10の#include < 設定 >
 11の#include <地図>
 12の#include <sstream提供さ>
 13  のconst  int型 INF = 0x3f3f3f3f 14 typedefの長い 長いLL。
 const  int型 MOD = + 1E9 7。;
 16  // constのダブルPI = ACOS(-1); 
17  の#defineバグCOUT << "---------------------" << ENDL
 18は CONST  INT MAXM = 1E6 + 10 ;
 19  のconst  int型 MAXN = 1E5 + 10 ;
 20で 使用し た名前空間STD;
 21である 
22がある INT DP [ 105 ] [ 105 ]; // iは、合計を表すDP [I]、[J]、何ビット(iは= Lを<)、jはフロントの数を表す(J <K)
23である 
24  INT (メイン)
 25  {
 26は、     INTK、L、
 27      scanfの(" %のDの%のD "、&​​K&L)、
 28      のためにint型 i = 0 ; iはK <; iは、++は)/// ループは、次のを容易にするために、行が第1に初期化/ I 2 =の計算
29          [DP 1 ] [I] = 1 ;
 30      のためのint型 I = 2 ; Iは= Lを<; Iは++ 31は、     {
 32          のためにINT J = 0 ; J <K、J ++ 33である         {
 34れます             INT G = 0 ; G <K; G ++35              {
 36                  IF(= J-G!1。 && = G + J!1。 /// /隣接していないが、約
37 [                  {
 38は                      DP [I] [J] + DP = [I- 1 ] [G]; // 疲れたラインサイクルプラスDP 
39                      DP [I] [J]%= MOD;
 40                  }    
 41である             }
 42である         }
 43である     }
 44は、      LL ANS = 0 ;
 45      INT I = 1 ; Iは、Kを<; Iは++)//蓄積、DP [L]の最後の行は、[0]の数の代表は、0から始まり、無統計は
46であり     、{
 47の          ANS + = [I] DP [L];
 48          ANS%= MOD;
 49      }
 50      のprintf(" %LLD \ N- " 、ANS);
 51である     リターン 0 ;
 52です }

 

 

 

 

 

おすすめ

転載: www.cnblogs.com/jiamian/p/11790093.html