説明
ある n個の 行に立って人々が。そして、あります m個の 数字、1.2 ...メートル。一人一人には、番号を選択する必要があります。互いに隣接して立っている二人は、同じ番号を選択した場合でも、数が等しいかより小さくないはず K。別にこのルールから、これ以上の制限条件はありません。
そして、あなたは彼らがルールに従う番号を選択することができますどのように多くの方法を計算する必要があります。
入力
複数のテストケースがあります。各ケースは、3個の整数N(2≤N≤10を含む、行を含む8)、M(30000≤2≤M)、K(0≤k個の≤m)を。
出力
各ケースの一つのライン。方法モジュール1000000007の数。
サンプル入力
4 4 1
サンプル出力
216
************************************************* ************************************************** ************************************************** ******
高速電力行列DP [n]が[1]かかりすなわち> =番号k方式の総数は、DP [N] [2] <総数kのスキーム取ることである
DP [N-] [する。1 ] = DP [N - 1] [1] *(MK)+ DP [N - 1] [2]
*(MK);。。。。DPは、[N-] [2] DP [N - 1] * K + DP [N-を= -1] [2] *(K -1);
マトリックスを示しています
。。。:MK MK DP [1-N-] [1] DP [N-] [1]
。K-K 1 DP [N - 1] [2] DP [。 n]は、[2]
素早く高速電力行列により解決を得ることができる
************************************ ************************************************** ************************************************** *******************
1の#include <iostreamの> 2の#include < ストリング > 3の#include <CStringの> 4の#include <cmath> 5の#include <cstdioを> 6の#include <アルゴリズム> 7 の#define LL長い長 8 の#define MOD十億七 9 使用して 名前空間STD; 10 LLのN、M、K。 図11は、保存LL [ 5 ] [ 5 ]。 12 LLのMOD(LLのM、LL n)が 13 { 14 LL和= 1 。 15 一方、(N) 16 { 17 であれば(N - 1 ) 18 合計=(SUM * m)の%MOD。 19 、M =(M×m個)%MOD。 20 N = N >> 1 。 21 } 22 リターン和。 23 } 24 のint main()の 25 { 26 ながら(scanf関数(" %LLD%LLD%LLD "、&N、&M&K)!= EOF) 27 { 28 であれば(k個の== 0 ) 29 { 30 のprintf("%LLD \ n "MOD(M、N)% MOD); 31 続ける; 32 } 33 であれば(N == 1 ) 34 { 35 のprintf(" %のLLDを\ n " 、M); 36 続ける; 37 } 38 【セーブ1 ] [ 1 ] = M- Kを、 39 [保存1 ] [ 2 ] = M- K; 40 [セーブ2 ] [ 1 ] = K; 41 保存[ 2 ] [ 2 ] = K- 1 。 42 LL ANS1 = M- K。 43 LL ANS2 = K。 44 N-- 。 45 一方、(N) 46 { 47 であれば(N - 1 ) 48 { 49 LLのTEMP1 =(((ANS1 *セーブ[ 1 ] [ 1 ])%MOD)+((ANS2 *セーブ[ 1 ] [ 2 ])%MOD ))%MOD。 50 LLのTEMP2 =(((ANS1 *セーブ[ 2 ] [ 1])%MOD)+((ANS2 *セーブ[ 2 ] [ 2 ])%MOD))%MOD。 51 ANS1 = TEMP1。 52 ANS2 = TEMP2。 53 } 54 N = N >> 1 。 55 =(((セーブ[LL A1を1 ] [ 1 ] *セーブ[ 1 ] [ 1 ])%MOD)+((セーブ[ 1 ] [ 2 ] *セーブ[ 2 ] [ 1 ])%MOD))%MOD。 56 LLのA2 =((([セーブ1 ] [ 2 ] *セーブ[ 2 ] [2 ])%MOD)+((セーブ[ 1 ] [ 1 ] *セーブ[ 1 ] [ 2 ])%MOD))%MOD。 57 =(((セーブ[LL B1を2 ] [ 2 ] *セーブ[ 2 ] [ 1 ])%MOD)+((セーブ[ 2 ] [ 1 ] *セーブ[ 1 ] [ 1 ])%MOD))%MOD。 58 = LLのB2(((セーブ[ 2 ] [ 2 ] *保存は、[ 2 ] [ 2 ])%MOD)+((セーブ[ 2 ] [ 1 ] *セーブ[ 1 ] [ 2 ])%MOD))%MOD。 59 [保存1 ] [ 1 ;] = A1 【セーブ1 ] [ 2 ] = A2。 60 [保存] 2 ] [ 1 ] = B1。【セーブ2 ] [ 2 ] = B2。 61 62 } 63 のprintf(" %LLDする\ n "、(ANS1 + ANS2)%MOD)。 64 } 65 リターン 0 。 66 }
ます。https://www.cnblogs.com/sdau--codeants/p/3446454.htmlで再現