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

猜你喜欢

转载自www.cnblogs.com/poorpool/p/8882312.html