关于卡常
查看原帖
关于卡常
511676
naoliaok_lovely楼主2023/6/9 16:12

rt,不过不是luogu上,学校OJ限时只有1s,而且数据也要强一点,被卡哩。

#include<bits/stdc++.h>
#pragma GCC optimize(3)
using namespace std;
#define LL long long

const int N = 510, M = 1e6 + 10, mod = 1e9 + 7;
int n, k, h[N];
int f[N][N];
int tot;

inline int mo(int x)
{
	return x < mod ? x : x - mod;
}

inline LL ksm(LL x, LL y)
{
	LL res = 1;
	x %= mod;
	while(y)
	{
		if(y & 1) res = res * x % mod;
		y >>= 1;
		x = x * x % mod;
	}
	return res;
}

int fac[M], inv[M];
inline void init(int n)
{
	fac[0] = 1;
	for(register int i = 1; i <= n; i = -~i)
		fac[i] = 1ll * fac[i - 1] * i % mod;
	inv[n] = ksm(fac[n], mod - 2);
	for(register int i = n - 1; i >= 0; i = ~-i)
		inv[i] = 1ll * inv[i + 1] * (i + 1) % mod;
}

inline int C(int n, int m)
{
	if(n < m) return 0;
	return 1ll * fac[n] * inv[n - m] % mod * inv[m] % mod;
}

inline int dp(int l, int r, int d)
{
	if(l > r) return 0;
	
	int minn = 0;
	for(register int i = l; i <= r; i = -~i)
		if(h[i] < h[minn]) minn = i;
	
	int x = dp(l, ~-minn, h[minn]), y = dp(-~minn, r, h[minn]);
	tot = -~tot;
	for(register int i = 0; i <= k; i = -~i)
		for(register int j = 0; j <= i; j = -~j)
			f[tot][i] = mo(f[tot][i] + 1ll * f[x][j] * f[y][i - j] % mod);
	int len = r - l + 1;
	for(register int i = k; i >= 0; i = ~-i)
		for(register int j = 1; j <= i; j = -~j)
			f[tot][i] = mo(f[tot][i] + 1ll * f[tot][i - j] * C(h[minn] - d, j) % mod * C(len - i + j, j) % mod * fac[j] % mod);
	
	return tot;
}

int main()
{
	init(1e6);
	
	scanf("%d%d", &n, &k);
	for(register int i = 1; i <= n; i = -~i)
		scanf("%d", &h[i]);
	h[0] = 1e9;
	
	f[0][0] = 1;
	printf("%d\n", f[dp(1, n, 0)][k]);
	return 0;
}

2023/6/9 16:12
加载中...