問題一覧 > 通常問題

No.829 成長関数インフレ中

レベル : / 実行時間制限 : 1ケース 2.000秒 / メモリ制限 : 512 MB / 標準ジャッジ問題
タグ : / 解いたユーザー数 16
作問者 : Pachicobue / テスター : kopricky
1 ProblemId : 2596 / 出題時の順位表 / 自分の提出
問題文最終更新日: 2019-05-03 23:24:48

問題文

青木くんは競技プログラミングの精進を毎日行っており,これまでにN日間コンテストに出てそれぞれの得点を記録していました。
得点数列を A={A1,A2,...,AN} と仮定したとき、 青木くんはN日間の「成長数 g(A) 」を max{A1,A2,...,Ai}<Ai+1 となる 0iN1 の個数と定義しているようです。
但し, max()= とします。
例えば A={1,2,1,2,4} の成長数は3です(1日目にも「成長した」とすることに注意して下さい)。

ある日不慮の事故で得点記録の日付が消えてしまい、得点の集合(重複を許す)が {S1,S2,...,SN} であることは分かるものの、 元の順番がわからなくなりました。
つまり各日の得点数列 {A1,A2,...,AN} は、{1,2,..,,N} の順列 p を用いて Ai=Spi と表せることが分かっています.
以下, S(p):={Sp1,Sp2,...,SpN} と記すことにします。

青木くんは自分の成長度を推し量るべく、 {1,2,...,N} の順列 p 全てに対するスコア関数 SCORE(p)=g(S(p))×Bg(S(p)) の総和が知りたくなりました。 ここで B は与えられる正の整数です。
あなたの仕事は青木くんの代わりにこの問題を解くことです。 但し、答えは非常に大きくなりうるので 109+7 で割った余りを教えてあげて下さい。

入力

N B
S1 S2 S3  SN

1行目に得点集合 S の大きさ N 、スコア関数の定義に関わる値 B が空白区切りで与えられます。
2行目に得点集合 S の要素が空白区切りで与えられます。

制約
  • 1N2×105
  • 1B<109+7
  • 0Si<N
  • 入力は全て整数である。

出力

{1,2,...,N} の順列 p に対する SCORE(p)=g(S(p))×Bg(S(p)) の総和を109+7で割った余りを一行に出力して下さい。
最後に改行して下さい。

サンプル

サンプル1
入力
3 2
0 1 2
出力
52

各順列に対応する得点順は

  • A={0,1,2}:g(A)=3, SCORE=3×23
  • A={0,2,1}:g(A)=2, SCORE=2×22
  • A={1,0,2}:g(A)=2, SCORE=2×22
  • A={1,2,0}:g(A)=2, SCORE=2×22
  • A={2,0,1}:g(A)=1, SCORE=1×21
  • A={2,1,0}:g(A)=1, SCORE=1×21
で、総和は24+8+8+8+2+2=52となります。

サンプル2
入力
2 1
1 1
出力
2

順列p={0,1},{1,0}で得点数列は同じA={1,1}となりますが、区別して数えることに注意して下さい。

サンプル3
入力
6 548438800
2 3 3 1 0 2
出力
140476412

提出するには、Twitter 、GitHub、 Googleもしくは右上の雲マークをクリックしてアカウントを作成してください。