説明
暁明は小さなスティックの異なる長さの束の手の中に、暁明はランダムに明らかな成功の確率が非常に高く、これは三角形を構成するかどうかを確認するために3つの山から選ばれ、今暁明は、難易度を増加したいと思い、
彼はランダムスタックスティック4から選択され、正三角形のスペルを楽しみにして、明らかにこの可能性は比較的低いです。あなたが与えられたn個の木製の棒され、選択方法のどのように多くの種類を尋ねました。
この方法は非常に大きく選択することができるので、最終的な答えの剰余1E9 + 7の必要性。
エントリー
2行を入力します。
最初の行のn、棒は、nの合計でした。
Nの合計数の2行目、各スティックの長さでした
輸出
これは、成功した選択方法の合計数を表す数値を出力します
サンプル入力1
4 2 2 4 4
サンプル出力1
1
プロンプト
N <= 100,000。
スティック長<= 5000
考え
配列A(N、M)= N ×(N-1)。(NM + 1)= N!/(NM)!(Nは添え字であり、mは上付き文字であり、以下同様)
組成物C(N、 M)= P(N、M )/ P(M、M)= N!/ m!(NM)!
問題は、私は、jは=とき場合には、
スティックの長さ及びスティックの長さの1/2であった≥2は、ANS + = [I] *([I] -1)/ 2 *([I << 1] *([I << 1 ] -1)/ 2 + ANS = C(I、2)+ C(J、2)。
スティックの長さ、Bスティックが≥1、A + Bである場合スティック≥2、ANS + = [I] * [J] *([iが+ J] *([iが+ J] -1- )+ = C / 2 ANSは、(i 2)+ I + jが、jは+。
コード:
#include <cmath> の#include <cstdioを> する#include <CStringの> する#include <iostreamの> する#include <アルゴリズム> 名前空間STDを使用して、 const int型N = 5010; const int型のMod = 1E9 + 7。 N INT、X; 長い長いANS、[N]。 INTメイン(){ scanf関数( "%のD"、&N); (N--){一方 のscanf( "%d個"、&x)は、 [X] ++; } ため(INT i = 1; iは= 5000 <; I ++) のための(INT J = I; J <= 5000; J ++){ (iはj>は5000 +)場合 ブレーク。 IF(I == J){ IF([I]> = 2 && [I << 1]> = 2) ANS =(ANS +([I] *([I] -1)/ 2LL%モッド* ([I << 1] *([I << 1] -1)/ 2)%MOD))%のMod。 ANS =%MOD(ANS +([I]は* [j]は%国防省*(-1)/ 2)%MOD)*([I jの+] [iがjで+])。 } } のprintf( "%LLDを\ n"、ANS)。 0を返します。 }