説明
隣接する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です }