P3270
是我会的题,所以感觉难度不如 noip T3T4。
设
转移,设这轮中有
其中:
边界是
容易发现瓶颈在于
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 110;
const ll P = 1e9 + 7;
int n, m, k, u[N], r[N];
ll f[N][N], y[N*2], t[N], C[N][N];
ll qp(ll x, ll y){
ll ans = 1;
while(y){
if(y & 1){
ans = ans * x % P;
}
x = x * x % P;
y >>= 1;
}
return ans;
}
ll lglr(int xk){
ll res = 0;
for(int i = 1; i <= n + n; ++ i){
ll mul = y[i];
for(int j = 1; j <= n + n; ++ j){
if(j != i){
mul = mul * (xk - j + P) % P * qp(i-j+P, P-2) % P;
}
}
res = (res + mul) % P;
}
return res;
}
int main(){
scanf("%d%d%d", &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 <= n; ++ i){
C[i][0] = C[i][i] = 1;
for(int j = 1; j < i; ++ j){
C[i][j] = (C[i-1][j] + C[i-1][j-1]) % P;
}
}
f[0][n-1] = 1;
for(int i = 1; i <= m; ++ i){
for(int j = 1; j <= n + n; ++ j){
y[j] = (y[j-1] + qp(j, n-r[i]) * qp(u[i]-j, r[i]-1)) % P;
}
t[i] = lglr(u[i]);
for(int j = 0; j <= n-1; ++ j){
for(int k = 0; k <= min(n-j-1, r[i]-1); ++ k){
f[i][j] = (f[i][j] + f[i-1][j+k] * C[j+k][k] % P * C[n-1-j-k][r[i]-1-k] % P * t[i] % P) % P;
}
}
}
printf("%lld\n", f[m][k]);
return 0;
}