萌新求助
查看原帖
萌新求助
65884
ctt2006楼主2021/3/23 22:51
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;

#define int long long
const int Mod = 1e9 + 7;
const int N = 105;
int frac[N+5],inv[N+5],n,m,k;
int u[N],r[N],S[N],ans;
int suf[N<<4],pre[N<<4],Y[N<<4];
inline int read() {
    int x=0,ff=1;
    char ch=getchar();
    while(ch<'0'||ch>'9') {
        if(ch=='-')
            ff=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9') {
        x=(x<<1)+(x<<3)+(ch^48);
        ch=getchar();
    }
    return x*ff;
}

inline int power(int x,int y) {
	int rel = 1;
	for(;y;y >>= 1) {
		if(y & 1) rel = rel * x % Mod;
		x = x * x % Mod;
	}
	return rel;
}

inline int C(int x,int y) {
	if(x < y) return 0;
	return frac[x] * inv[y] % Mod * inv[x-y] % Mod;
}

void prework() {
	frac[0] = frac[1] = 1;
	for(int i = 2;i <= n;i++) frac[i] = frac[i-1] * i % Mod;
	inv[n] = power(frac[n],Mod-2) % Mod; 
	for(int i = n-1;i >= 0;i--) inv[i] = inv[i+1] * (i+1) % Mod;
}

inline int calc(int x,int cs) {
	int now = Y[x];
	int Inv = 1;
	now = now * pre[x-1] % Mod * suf[x+1] % Mod;
	Inv = frac[x-1] % Mod * frac[cs-x] % Mod;
	if((cs - x) & 1) Inv = Inv * (-1);
	Inv = (Inv + Mod) % Mod;
	now = now * power(Inv,Mod-2) % Mod;
	return now; 
}

signed main () {
	n = read();m = read();k = read();
	for(int i = 1;i <= m;i++) u[i] = read();
	for(int i = 1;i <= m;i++) r[i] = read();
	prework();
	for(int i = 1;i <= m;i++) {
		S[i] = 0;
		for(int j = 0;j < r[i];j++) {
			int ff = 1;
			if(j & 1) ff = -1;
			int ret = 0;
			memset(Y,0,sizeof(Y));
			pre[0] = 1;suf[n+j-r[i]+3] = 1;
			for(int K = 1;K <= (n+j-r[i]+2);K++) Y[K] = Y[K-1] + power(K,n+j-r[i]) % Mod;
			for(int K = 1;K <= (n+j-r[i]+2);K++) pre[K] = pre[K-1] * (u[i]-K) % Mod;
			for(int K = (n+j-r[i]+2);K >= 1;K--) suf[K] = suf[K+1] * (u[i]-K) % Mod;
			for(int K = 1;K <= (n+j-r[i]+2);K++) {
				ret = (ret + calc(K,n+j-r[i]+2)) % Mod;
				ret = (ret + Mod) % Mod;
			} 
			S[i] = (S[i] + (ff * C(r[i]-1,j) % Mod * power(u[i],r[i]-j-1) % Mod * ret + Mod) % Mod) % Mod;
		}
	}
	for(int i = k;i <= n-1;i++) {
		int ff = 1;
		if((i-k) & 1) ff = -1;
		int F = C(n-1,i);
		for(int j = 1;j <= m;j++) {
			F = F * C(n-i-1,n-r[j]-i) % Mod * S[j] % Mod;
		}
		ans = (ans + (ff * C(i,k) % Mod * F % Mod + Mod) % Mod) % Mod;
	}
	printf("%lld\n",ans);
	return 0;
}

我在做这道题的时候,在luogu上50分,在LOJ上交连样例都没过,但是我复制样例到IDE里跑出来的是对的, 并且用Luogu IDE结果也是对的。蒟蒻非常地疑惑,有大佬能解答一下吗?

2021/3/23 22:51
加载中...