loj2026 「JLOI / SHOI2016」成绩比较

时间:2025-04-11 09:03:01

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;
}