上道題中,妖夢斬了一地的木棒,現在她想要將木棒拼起來。
有 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 ...