正三角形icodelab

説明

暁明は小さなスティックの異なる長さの束の手の中に、暁明はランダムに明らかな成功の確率が非常に高く、これは三角形を構成するかどうかを確認するために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を返します。
}

 

おすすめ

転載: www.cnblogs.com/mysh/p/11306455.html