loj2026 「JLOI / SHOI2016」成绩比较

orz

#include <iostream>
#include <cstdio>
using namespace std;
typedef long long ll;
int n, m, k, C[105][105], u[105], r[105], g[105];
const int mod=1e9+7;
int ksm(int a, int b){
	int re=1;
	while(b){
		if(b&1)	re = (ll)re * a % mod;
		a = (ll)a * a % mod;
		b >>= 1;
	}
	return re;
}
int main(){
	cin>>n>>m>>k;
	for(int i=1; i<=m; i++)	scanf("%d", &u[i]);
	for(int i=1; i<=m; i++)	scanf("%d", &r[i]);
	C[0][0] = 1;
	for(int i=1; i<=100; i++){
		C[i][0] = 1;
		for(int j=1; j<=i; j++)
			C[i][j] = (C[i-1][j-1] + C[i-1][j]) % mod;
	}
	int ans=0, tva=1;
	for(int i=k; i<n; i++){
		int tmp=C[n-1][i];
		for(int j=1; j<=m; j++)
			tmp = (ll)tmp * C[n-1-i][r[j]-1] % mod;
		ans = (ans + (ll)tva*tmp%mod*C[i][k]%mod)%mod;
		if(ans<0)	ans = (ans + mod) % mod;
		tva *= -1;
	}
	for(int i=1; i<=m; i++){
		g[0] = u[i];
		for(int x=2; x<=n; x++){
			int tmp=0;
			for(int j=0; j<=x-2; j++)
				tmp = (tmp + (ll)C[x][j]*g[j]%mod) % mod;
			g[x-1] = (ll)(ksm(u[i]+1,x)-1-tmp+mod) % mod * ksm(x, mod-2) % mod;
		}
		int tmp=0, tva=1;
		for(int l=0; l<r[i]; l++){
			tmp = (tmp + tva * (ll)C[r[i]-1][l]*ksm(u[i], r[i]-1-l)%mod*g[n-r[i]+l]%mod) % mod;
			if(tmp<0)	tmp = (tmp + mod) % mod;
			tva *= -1;
		}
		ans = (ll)ans * tmp % mod;
	}
	cout<<ans<<endl;
	return 0;
}
原文地址:https://www.cnblogs.com/poorpool/p/8882312.html