1. 程式人生 > 其它 >【luogu_P3799】妖夢拼木棒

【luogu_P3799】妖夢拼木棒

妖夢拼木棒

感謝 @Jackma_mayichao大佬的幫助


題目連結:妖夢拼木棒

解題思路

感性理解一下題意:用4根木棒組成一個正三角形,說白了就是選兩根相等的木棒,然後再挑兩根相加得原來兩根木棒的,組合一下即可。

那麼我們翻一下組合數學

在這裡插入圖片描述
因為 m m m 在此題等於 2 2 2 ,那麼我們可以將其化簡,得:
n ( n − 1 ) 2 \frac{n(n-1)}{2} 2n(n1)

code

#include<iostream>
#include<cstdio>
#define int long long
using namespace std;

const
int mod=1e9+7; int n,a[5010]; int maxn,ans; signed main() { cin>>n; for(int i=1;i<=n;i++) { int t; scanf("%lld",&t); a[t]++; maxn=max(maxn,t); } for(int i=2;i<=maxn;i++) { if(a[i]<=1) continue; for(int j=1;j<=i/2;j++) { if(i-j!=j&&a[i]
&&a[j]) ans=(ans+(a[i]*(a[i]-1)/2*a[j]*a[i-j])%mod)%mod; else if(i-j==j&&a[j]>=1) ans=(ans+((a[i]*(a[i]-1)/2)%mod*(a[j]*(a[j]-1)/2)%mod)%mod)%mod; } } cout<<ans<<endl; }