给定
一看题意和数据范围,DP 显然,不难想到设状态
同时注意转移前需要判断是否满足
然后按照这个做完会发现 WA 了两个点,具体看一下就会发现,按照这个式子,如果
xxxxxxxxxx
611
2
3
4
5
6
7
8
9
10
11using namespace std;
12
13mt19937 rnd(random_device{}());
14int rndd(int l, int r){return rnd() % (r - l + 1) + l;}
15bool rnddd(int x){return rndd(1, 100) <= x;}
16
17typedef unsigned int uint;
18typedef unsigned long long unll;
19typedef long long ll;
20typedef long double ld;
21
22
23
24template < typename T = int >
25inline T read(void);
26
27int N, M, K;
28ll dp[1100][5100];
29ll sum[5100];
30
31int main(){
32 N = read(), M = read(), K = read();
33 for(int i = 1; i <= M; ++i)dp[1][i] = 1, sum[i] = i;
34 for(int i = 2; i <= N; ++i){
35 for(int j = 1; j <= M; ++j){
36 (dp[i][j] += j + K <= M ? (sum[M] - sum[j + K - 1] + MOD) % MOD : 0) %= MOD;
37 (dp[i][j] += j - K >= 1 ? sum[j - K] : 0) %= MOD;
38 if(!K)(dp[i][j] += -(sum[j] - sum[j - 1]) + MOD) %= MOD;
39 }
40 for(int j = 1; j <= M; ++j)
41 sum[j] = (sum[j - 1] + dp[i][j]) % MOD;
42 }printf("%lld\n", sum[M]);
43 fprintf(stderr, "Time: %.6lf\n", (double)clock() / CLOCKS_PER_SEC);
44 return 0;
45}
46
47template < typename T >
48inline T read(void){
49 T ret(0);
50 int flag(1);
51 char c = getchar();
52 while(c != '-' && !isdigit(c))c = getchar();
53 if(c == '-')flag = -1, c = getchar();
54 while(isdigit(c)){
55 ret *= 10;
56 ret += int(c - '0');
57 c = getchar();
58 }
59 ret *= flag;
60 return ret;
61}
update-2022_12_05 初稿