program
【题目分析】
题目的意思是在一个数列中找到四个数,a[i]=a[j]<a[k]=a[l],其他都扯淡。
先把这些数sort一下,所有相等的数字就都排在一起了,然后这个数列可以按照数字的种类划分成一些段,每一段的数字都是相同的(1 1 4 4 5 5 6 12 12 12) ,每一个段和他后面的段都可以组成满足题目条件的答案。而每个段中的选择方式又有len^2种,我们维护一个前缀和数组sum[i]记录从第一段到第i段的每段组合数的和
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; const int mo=1e9+7; const int maxn=1e6+10; int n; int a[maxn],num[maxn],sum[maxn]; int ans; int x; int main() { // freopen("program.in","r",stdin); // freopen("program.out","w",stdout); scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); sort(a+1,a+n+1); for(int i=1;i<=n;i++) num[i]=0; for(int i=1;i<=n;i++) { if(a[i]!=a[i-1]) x++; num[x]++; } for(int i=1;i<=x;i++) num[i]=(num[i]*num[i])%mo; for(int i=1;i<=x;i++) sum[i]=sum[i-1]+num[i]; for(int i=1;i<x;i++) ans=(ans+num[i]*(sum[x]-sum[i]))%mo; cout<<ans; fclose(stdin);fclose(stdout); return 0; }