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 。 }