洛谷P3799 妖夢拼木棒

2022-05-01 10:27:07 字數 1228 閱讀 3214

題目提供者orangebird

標籤難度普及/提高-

時空限制1s / 128mb

提交 討論

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

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

輸入格式:

第一行乙個整數n

第二行n個整數,a1,a2,……an(0一行乙個整數,對1e9+7取模

輸入樣例#1:

4 1 1 2 2

輸出樣例#1:

1

對於30%的資料 n<=5000

對於100%的資料 n<=100000

by-szc

吐槽:做這道題發現了我個人的很多問題,做題實在是不夠仔細!

分析:假設選4根木棍長度為a=b=c+d,我們列舉a和c,就能計算出b和d,這就變成了從所給長度中能選出多少根我們列舉長度的木棍,就要用到組合數。需要注意的是,我們要特判c是否等於d,因為選擇一根c長度的木棍的方案數*選擇一根d長度木棍的方案數≠選擇兩根c長度木棍的方案數,同時,列舉c到a/2就一定要停止,因為超過a/2,就會把乙個答案算2次。關於取模的問題,其實我們只需要用到兩個組合數,這兩個組合數在計算的時候都不必取模,為什麼呢?因為5000*4999/2 < 1e9 + 7,如果非要取模,就只有用逆元了。

如果是用數學方法做這種統計方案數的題一定要非常細心!注意所有可能但不完全相同的情況並且不能多算少算!

#include #include 

#include

#include

typedef

long

long

ll;using

namespace

std;

const

int mod = 1000000007

;int

n;long

long a[5010

],maxn,ans;

ll c1(ll x)

ll c2(ll x)

intmain()

for (int i = 1; i <= maxn; i++)

for (int j = 1; j <= i/2; j++)

else

ans %=mod;

}printf(

"%lld\n

", ans %mod);

return0;

}

洛谷P3799 妖夢拼木棒

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

P3799 妖夢拼木棒

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

洛谷p3799 妖夢切木棒

題意 任選四段木板拼正三角形 因為是正三角形 所以我們可以想到至少是兩個相同的,剩下兩個拼成最後一條邊 我們只需要列舉邊長即可 那麼我們對每次讀入的x,使他的cnt 考慮用乙個二重迴圈 外層列舉邊長的長度 從2到5000 內層列舉用來拼成最後一條邊的其他一根木板 一次迴圈對答案有貢獻 當且僅當邊長的...