cf 938E
Posted mxang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了cf 938E相关的知识,希望对你有一定的参考价值。
哇自闭了。
一样个毛啊。
和之前见过的几道感觉很类似啊。
首先一个数如果有贡献那么在他后面一定有一个大于它的数,并且前面的全比他小,然后我就跑偏了。。。
于是我们先排个序,显然无影响,我们可以考虑从 n 个位置里选择 n-i+1 个,用来存放 大于等于他自己的数,
这n-i+1个位置要保证 他自己在最前面吧,就是 (n-i)! 种,剩下i-1个位置随便放,(i-1)!
所以一个数的贡献次数 就是 C(n,n-i+1)*(i-1)!*(n-i)!,然后再乘上权值和次数就阔以惹qwq
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const int N = 1e6+6; 5 const ll mod = 1e9+7; 6 int n;ll a[N]; 7 ll up[N],inv[N],down[N]; 8 void init(){ 9 inv[1]=down[0]=up[0]=1; 10 for(int i=2;i<=1e6;i++){ 11 inv[i]=(mod-mod/i)*inv[mod%i]%mod; 12 } 13 for(int i=1;i<=1e6;i++){ 14 up[i]=up[i-1]*i%mod; 15 down[i]=down[i-1]*inv[i]%mod; 16 } 17 } 18 int main(){ 19 //ios::sync_with_stdio(false); 20 init(); 21 scanf("%d",&n); 22 for(int i=1;i<=n;i++)scanf("%d",&a[i]); 23 sort(a+1,a+1+n); 24 ll ans=0; 25 for(int i=1,j;i<=n;i=j+1){ 26 j=i; 27 while (a[j+1]==a[i])j++; 28 if(j<n) 29 ans=(ans+a[i]*(j-i+1)%mod*up[n]%mod*up[n-i]%mod*up[i-1]%mod*down[n-i+1]%mod*down[i-1]%mod)%mod; 30 } 31 cout<<ans<<endl; 32 }
以上是关于cf 938E的主要内容,如果未能解决你的问题,请参考以下文章