クラップスDP

B.サイコロ

時間の一点:2.0秒

メモリの制限:512メガバイト

ダイス、ボーを投げるために使用される中国の伝統的な民俗エンターテイメントは、早くも戦国時代のように発明されたました。

あなたは、与えられた  n個  見つけ、サイコロを  n個の  点の数とにサイコロを投げる   可能性があります。

入力形式

入力整数の最初のライン  T、発現  Tの  テストデータのセット1 T 10  
二つの整数テストデータ入力の各セットnはAは、の合計を表し、Nダイを、ダイ和1 N 1000年N- A 。6 * N-

出力フォーマット

その場合は。回答  10 9 + 7  取るより。

サンプル

入力
2 
1 2 
2 2
出力
166666668 
27777778 

状態遷移方程式DP [I] [J] = (DP [I] [J] + DP [I-1] [K])%MOD; // iはi番目の篩を指し、jは指しますjが(その前にそれを書き留め、長い時間を理解していなかったに見えた)プログラムのためのポイントのとき総数
#include <iostreamの> 
する#include <cstdioを> 
する#include <アルゴリズム> 
の#include <CStringの>
 使用して 名前空間STD。
typedefの長い 長いLL。
const  int型 MOD = 1E9 + 7 CONSTの INT N = 1E3 + 7 
LL DP [N] [N * 6 ]。
ARR [N] LL。

LLのKSM(LLのX、LLのY){ 
    LL RES = 1 一方、(Y){
         場合(Y&1)RES =の解像度* X%MOD。
        X = X * X%MOD。
        Y >> = 1 
    } 
    戻りRESと、
} 

int型のmain(){
     int型のT。
    scanf関数(" %のD "、&T)。
    一方、(t-- ){ 
         int型N、M。
        scanf関数(" %d個の%のD "、&​​N、&M)。
        memsetの(DP、0はsizeof (DP))。  
        DP [ 0 ] [ 0 ] = 1 int型 iは= 1、I ++; iが<= N。 {)
             のためint型 J = I; J <= 6 * N; J ++ ){ 
                 ためのint型 K = J = 6、K <Jあり、k ++ ){
                     場合(kは< 0続けます
                    DP [I] [J] =(DP [I] [J] + DP [I- 1 ] [K])%MOD。
                } 
            } 
        } 
        のprintf(" %のLLDを\ n "、(DP [n]は[M] * KSM(KSM(6、N)、mod- 2))%のMOD)。        
    } 
    戻り 0 
}

 




おすすめ

転載: www.cnblogs.com/Accepting/p/11374424.html