给定
一看题意和数据范围,DP 显然,不难想到设状态
同时注意转移前需要判断是否满足
然后按照这个做完会发现 WA 了两个点,具体看一下就会发现,按照这个式子,如果
xxxxxxxxxx61123
45678910
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
2223
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 初稿