P3799 妖夢拼木棒 暴力列舉 組合數

2022-09-12 03:24:08 字數 1146 閱讀 8122

上道題中,妖夢斬了一地的木棒,現在她想要將木棒拼起來。

有 nn根木棒,現在從中選 4 根,想要組成乙個正三角形,問有幾種選法?

答案對 10^9+7 取模。

第一行乙個整數 nn。

第二行 nn 個整數,第 i 個整數 ai​ 代表第 i 根木棒的長度。

一行乙個整數代表答案。

輸入

4 

1 1 2 2

輸出

1
資料規模與約定

首先,我們分析題意,可知要選擇四根木棍組成正三角形,可知一定有兩根木根作為完整的一條邊且長度相等。另外,有兩根木棍通過合併組成另一條邊。這裡我們假設三角形的邊長為i,那麼有兩條長度為i的邊,那麼另兩條較短的木棍長度為j和i-j。

我們先用乙個num陣列儲存所有的木棍的數量,同時利用max和min記錄所有木棍中最長和最短的木棍。

然後通過i從min+1到max遍歷所有木棍(不用從min開始,因為j要更小些),然後j從min到i/2遍歷。其中注意,如果num[i]<2那麼就無需再進行內層的j的遍歷了,因為i的數量不夠。如果num[i]>=2,那麼我們進行j的遍歷,其中有兩種情況:

當j!=i-j,ans=ans+c(num[i],2)*c(num[j],1)*c(num[i-j],1)%mod;

當j==i-j且num[j]<=2時,ans=ans+c(num[i],2)*c(num[j],2)%mod;

其中c(n,m)表示組合數。

#include#includeusing namespace std;

#define ll long long

#define maxn 100010

const int mod = 1e9 + 7;

int n;

int num[maxn] = ;

int main()

for (int i = min+1; i <= max; i++) //i得比j大

else if (num[j]>=2)

}} }

printf("%lld\n", ans%mod);

return 0;

}

P3799 妖夢拼木棒

有 nn根木棒,現在從中選 4 根,想要組成乙個正三角形,問有幾種選法?答案對 10 9 7取模。輸入 第一行乙個整數 n。第二行 n 個整數,第 i 個整數 a i,代表第 i 根木棒的長度。輸出 一行乙個整數代表答案。主要是對長度進行計算和處理 因為ai的數值偏小。注意 using namesp...

洛谷P3799 妖夢拼木棒

題目鏈結 上道題中,妖夢斬了一地的木棒,現在她想要將木棒拼起來。有n根木棒,現在從中選4根,想要組成乙個正三角形,問有幾種選法?第一行乙個整數n 第二行n個整數,a1,a2,an 0 一行乙個整數,對1e9 7取模 4 1 1 2 2 對於30 的資料 n 5000 對於100 的資料 n 1000...

洛谷P3799 妖夢拼木棒

題目提供者orangebird 標籤難度普及 提高 時空限制1s 128mb 提交 討論 題解上道題中,妖夢斬了一地的木棒,現在她想要將木棒拼起來。有n根木棒,現在從中選4根,想要組成乙個正三角形,問有幾種選法?輸入格式 第一行乙個整數n 第二行n個整數,a1,a2,an 0一行乙個整數,對1e9 ...