タイトル説明
今日、学校は生徒の日に割り当てられたJWJU番号です!私たちはカクテルで始まるようにしますが、できるだけたい学生の数を取得するためには、[ 1 、1 0 ^ 1 8 ]ランダムに自分の学生番号などの番号を選びます。しかし、いくつかの心は常にそこにある少しの友人が同じ数字を選ぶ必要があります-みんなの学校番号は一意である必要がありますので、どうやらこれは、合法的ではありません。
だから我々は、カクテル学生の数を調整することを決めました。彼は、次の2つの原則を変更するために使用します:
唯一、すべての人の最終学校の数が上昇する1、 最初に選択された一人一人に≥学生数を
図2は、できるだけ変更の合計量は、変形の総量は変化し、各個々の量を意味します。(変化の量は、初期数マイナス学生数の最終学習値です)
なお、変性最終学生数はより大きくてもよい10 ^ 1 8
2人の学生AとBがある場合はもちろん、学校の最初の選択肢は、彼らがカクテルの学生への変化である可能性が高い、第1ある として第1およびBの学生 2 に変更するには、番号、またはBの生徒 1号クラスメートとなる 第2号。
カクテルXiemeiの笑顔が、彼はあなたがどのように多くの異なる割り当て方式のすべての人の最終総学生数を彼に伝えたいと考えています。
説明を入力します。
最初の行は、正の整数含有する n個の学生の代表者の数を(1 ≤ N ≤ 。1 0 。5 )
次の行が含まれ 、各学生最初に選択された生徒の数を表し、nは正の整数。(範囲では[ 1 、1 0 ^ 1 。8 ] )
出力説明
出力整数は、最終的な実施形態の学生数を表します。(への答え 10 ^ 7 + 9 モジュロ)
2つのシナリオの存在下で、一人の学生の数が同じでない場合は、学生番号の2つの最終割当において、2つのプログラムが異なる割り当て方式であると見なされます。
サンプル入力1
3 1 1 2
サンプル出力1
4
サンプル入力2
2 1 5
サンプル出力2
1
プロンプト
実施例の第一のセットのために、最終的な生徒番号割り当て方式は、次の4つがあります。
[1,2,3]、[1,3,2]、[2,1,3]、[3,1,2] [ 1 、2 、3 ] 、[ 1 、3 、2 ] 、[ 2 、1 、3 ] 、[ 3 、1 、2 ]
配布後に同じ各学生の学生の数、およびこれらの種類のプログラムへの変更の合計額ではありません最小限です。
実施例の第二のグループのために、各学生は学生の数が同じではないいるので、無修正、最終的な割り当てがあるだけで一種、すなわち、[1,5] 、[ 1 、5 ]。
アイデア:
スタート1112 1222今である(2バリアント三2 2が選択された)になると仮定2つ以上(数-11)は、から選択される一つとなるように3 2 3 - > 2 3 4選択した変異体で1233年
そう答えが1 3 * 3 * 2であるように選択されたn番目のN(N-1)で選択されたトピックの確率です。
コード:
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 #defineっ長い長 LL MOD = 1E9 + 7 。 マップ <-1,11,11-> ミリメートル; INT メイン() { LLのX、N。 cinを >> N; 以下のために(int型 i = 0 ; iがn <I ++の) のscanf(" %のLLD "、&x)は、MM [X]を++ 。 LL ANS = 1 。 マップ <-1,11,11-> ::イテレータit。 用(;それ= mm.end();!それは)(mm.beginを=それ++)//そうでない場合は、OHタイムアウトしていない[x]の値が非常に横断しているであろうああ時間だけミリメートルにわたって反復を10 ^ 18のアレイのどの範囲のマップを使用し 、{ LL YY = IT-> SECOND ,; ANS = ANS * YY%MOD; IF(YY> 1。ミリメートル)IT->まず+ 1 + =(yy-] 1。); } のprintf(" %のLLDの\のN- " 、ANS); 戻り 0 ; }