给定
这种题 DP 很显然,考虑设状态
具体地,对于

对于
同时注意

边界可以是
xxxxxxxxxx58123
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
22template< typename T = int >23inline T read(void);24
25int N; int MOD;26int dp[3100][3100][2];27
28int main(){29 N = read(), MOD = read();30 dp[1][0][1] = dp[1][1][0] = 1;31 for(int i = 1; i <= N - 1; ++i)32 for(int j = 0; j <= N - 1; ++j)33 dp[i + 1][j + 1][0] = ((ll)dp[i + 1][j + 1][0] + dp[i][j][0]) % MOD,34 dp[i + 1][j][1] = ((ll)dp[i + 1][j][1] + dp[i][j][0]) % MOD,35 dp[i + 1][j + 1][1] = ((ll)dp[i + 1][j + 1][1] + dp[i][j][1] * 2ll) % MOD,36 dp[i + 1][j][1] = ((ll)dp[i + 1][j][1] + dp[i][j][1]) % MOD,37 dp[i + 1][j + 2][0] = ((ll)dp[i + 1][j + 2][0] + dp[i][j][1] * 2ll) % MOD,38 dp[i + 1][j + 1][1] = ((ll)dp[i + 1][j + 1][1] + dp[i][j][1]) % MOD;39 for(int i = 1; i <= N - 1; ++i)printf("%d%c", dp[N][i][1], i == N - 1 ? '\n' : ' ');40 fprintf(stderr, "Time: %.6lf\n", (double)clock() / CLOCKS_PER_SEC);41 return 0;42}43
44template < typename T >45inline T read(void){46 T ret(0);47 int flag(1);48 char c = getchar();49 while(c != '-' && !isdigit(c))c = getchar();50 if(c == '-')flag = -1, c = getchar();51 while(isdigit(c)){52 ret *= 10;53 ret += int(c - '0');54 c = getchar();55 }56 ret *= flag;57 return ret;58}update-2022_11_21 初稿