[BZOJ4559][JLOI2016]成績比較


bzoj
luogu

description

\(n\)名學生\(m\)門課,\(\mbox{yyb}\)碾壓了\(k\)名同學(即每門課的分數都大於等於那名同學的分數)。
已知每門課\(\mbox{yyb}\)的排名\(R_i\)和這門課的最高分\(U_i\)(分數區間是\([1,U_i]\)),求有多少種可能的得分情況。
\(n,m\le100,U_i\le10^9\)

sol

設有\(k\)名同學沒有被\(\mbox{yyb}\)碾壓,所以這\(k\)名同學至少要有一門比\(\mbox{yyb}\)要高。
每一門科目可以有\(R_i-1\)個人比\(\mbox{yyb}\)要高。
容斥一下,枚舉\(k\)個人中有\(i\)個人沒有一門比\(\mbox{yyb}\)

\[ans=\sum_{i=0}^k(-1)^i\binom{k}{i}\prod_{j=1}^{m}\binom{k-i}{R_j-1} \]

但是這樣算出來的只是每個人與\(\mbox{yyb}\)的相對分數的方案數,沒有計算具體分數。
在計算具體分數的方案數時,顯然每門課可以單獨考慮。
對於第\(i\)門課,考慮枚舉\(\mbox{yyb}\)的分數\(x\),那么滿足條件的方案數就是

\[\sum_{x=1}^{U_i}x^{n-R_i}(U_i-x)^{R_i-1} \]

這是一個關於\(U_i\)\(n\)次多項式,所以直接插值就可以了。
復雜度\(O(n^3\log n)\)然而網上很多題解的復雜度都遠優於這個qwq

code

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int gi(){
	int x=0,w=1;char ch=getchar();
	while ((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
	if (ch=='-') w=0,ch=getchar();
	while (ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
	return w?x:-x;
}
const int mod = 1e9+7;
const int N = 105;
int n,m,k,U[N],R[N],C[N][N],inv[N],f[N],ans;
int fastpow(int a,int b){
	int res=1;
	while (b) {if (b&1) res=1ll*res*a%mod;a=1ll*a*a%mod;b>>=1;}
	return res;
}
int main(){
	n=gi();m=gi();k=n-1-gi();
	for (int i=1;i<=m;++i) U[i]=gi();
	for (int i=1;i<=m;++i) R[i]=gi();
	C[0][0]=1;
	for (int i=1;i<=n;++i){
		C[i][0]=1;
		for (int j=1;j<=i;++j)
			C[i][j]=(C[i-1][j]+C[i-1][j-1])%mod;
	}
	inv[0]=inv[1]=1;
	for (int i=2;i<=n;++i) inv[i]=1ll*inv[mod%i]*(mod-mod/i)%mod;
	for (int i=0;i<=k;++i){
		int res=C[k][i];
		for (int j=1;j<=m;++j) res=1ll*res*C[k-i][R[j]-1]%mod;
		if (i&1) res=mod-res;(ans+=res)%=mod;
	}
	for (int i=1;i<=m;++i){
		int res=0;
		for (int j=1;j<=n;++j){
			f[j]=0;
			for (int k=1;k<=j;++k)
				f[j]=(f[j]+1ll*fastpow(k,n-R[i])*fastpow(j-k,R[i]-1))%mod;
		}
		if (U[i]<=n) {ans=1ll*ans*f[U[i]]%mod;continue;}
		for (int j=1;j<=n;++j){
			int s=f[j];
			for (int k=0;k<=n;++k)
				if (k!=j) s=1ll*s*(U[i]-k)%mod*(j>k?inv[j-k]:mod-inv[k-j])%mod;
			(res+=s)%=mod;
		}
		ans=1ll*ans*res%mod;
	}
	printf("%lld\n",1ll*ans*C[n-1][k]%mod);return 0;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM