mdzz,
O(1)
的求取C值,我在干嘛啊。。。连WA了好几次。。。。
推导出公示后(挺好推导的),就无脑AC。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<set>
#include<queue>
#include<algorithm>
#include<vector>
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<stack>
#define rez(i,x,y) for(int i=x;i>=y;i--)
#define res(i,x,y) for(int i=x;i<=y;i++)
#define INF 2100000000
#define ll long long
#define clr(x) memset(x,0,sizeof(x))
#define mod 1000000007
using namespace std;
ll a[5005],n,jc[100005]={1,1},ans;
template<class T>inline void read(T &res){
static char ch;T flag=1;
while((ch=getchar())<'0'||ch>'9')if(ch=='-')flag=-1;res=ch-48;
while((ch=getchar())>='0'&&ch<='9')res=res*10+ch-48;res*=flag;
}
int main(){
read(n);
for(register int i=2;i<=100000;++i)jc[i]=(jc[i-1]*i)%mod;
for(register int i=1,x;i<=n;++i)read(x),a[x]++;
for(register int i=2;i<=5000;i++){
if(a[i]>1){
ll ret=0;
for(register int j=1;j<=i/2;j++){
if(a[j]>0&&a[i-j]>0){
if(j!=(i-j)){
ret=(ret+a[j]*a[i-j]%mod)%mod;
}else{
if(a[j]>1)ret=(ret+(a[j]*(a[j]-1)/2)%mod)%mod;
}
}
}
ret=(ret*(a[i]*(a[i]-1)/2)%mod)%mod;
ans=(ans+ret)%mod;
}
}
cout<<ans<<endl;
return 0;
}