CF938E Max History
CF938E Max History
題意:
我們定義f(a)為:
1、開始時,f(a)=0,M=1。
2、對于每個2<=i<=n,如果a[M]<a[i],那么f(a)=f(a)+a[M],M=i。
現(xiàn)在對于一個給定的數(shù)組a,求其所有排列的f(a)之和,答案對1e9+7取模。
題解:
計數(shù)問題,組合數(shù)推導
經(jīng)常用的組合恒等式:
k?Cnk=n?Cn?1k?1k * C_{n}^{k}=n*C_{n-1}^{k-1}k?Cnk?=n?Cn?1k?1?
Ckn?Cmk=Cmn?Cm?nm?k(m?k<m?n)C_{k}^{n}*C_{m}^{k}=C_{m}^{n}*C_{m-n}^{m-k}(m-k<m-n)Ckn??Cmk?=Cmn??Cm?nm?k?(m?k<m?n)
∑i=0nCni=2n\sum_{i=0}^{n}C_{n}^{i}=2^n∑i=0n?Cni?=2n
∑k=0n?(?1)kCnk=0\sum_{k=0}^{n}*(-1)^kC_{n}^{k}=0∑k=0n??(?1)kCnk?=0
Cnk+Cnk+1=Cn+1k+1C_{n}^{k}+C_{n}^{k+1}=C_{n+1}^{k+1}Cnk?+Cnk+1?=Cn+1k+1?
∑k=0mCn+kk=Cn+m+1m\sum_{k=0}^{m}C_{n+k}^{k}=C_{n+m+1}^{m}∑k=0m?Cn+kk?=Cn+m+1m?
范德蒙德卷積:
∑i=0kCniCmk?i=Cn+mk\sum_{i=0}^{k}C_{n}^{i}C_{m}^{k-i}=C_{n+m}^{k}∑i=0k?Cni?Cmk?i?=Cn+mk?
代碼:
#include<bits/stdc++.h> #define mod 1000000007 const int maxn = 1000035;int n,ans,cnt,a[maxn],fac[maxn],inv[maxn];int read() {char ch = getchar();int num = 0, fl = 1;for (; !isdigit(ch); ch=getchar())if (ch=='-') fl = -1;for (; isdigit(ch); ch=getchar())num = (num<<1)+(num<<3)+ch-48;return num*fl; } int main() {n = read();for (int i=1; i<=n; i++) a[i] = read();std::sort(a+1, a+n+1);fac[0] = fac[1] = inv[0] = inv[1] = 1;for (int i=2; i<=n+2; i++){inv[i] = mod-1ll*(mod/i)*inv[mod%i]%mod,fac[i] = 1ll*fac[i-1]*i%mod;}for (int i=1,j; i<=n; i=j+1){for (j=i; a[j+1]==a[i]; j++);//J為 if (j==n) break;//i-1是嚴格比他小的數(shù) //n-j是嚴格大于他的數(shù) //j-i+1是與a[i]一樣大的數(shù)量 cnt = inv[n-i+1];ans = (1ll*ans+1ll*a[i]*(j-i+1)%mod*cnt%mod)%mod;}printf("%d\n",1ll*ans*fac[n]%mod);return 0; }總結
以上是生活随笔為你收集整理的CF938E Max History的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 野牡丹的功效与作用、禁忌和食用方法
- 下一篇: CF1009E Intercity Tr