for (int len = 3; len <= n; len++) { //此时的up,down数组为第len-1层的数据 //定义新newup,newdown来更新第len层的数据 int newup[r - l + 1] = {0}, newdown[r - l + 1] = {0}; for (int x = l; x <= r; x++) { //如果y->x为上升,那么就要加上所有z->y是下降的 for (int y = 0; y < x; y++) newup[x] = (newup[x] + down[y]) % MOD; //如果y->x为下降,那么就要加上所有z->y是上升的 for (int y = x + 1; y <= r; y++) newdown[x] = (newdown[x] + up[y]) % MOD; } for (int i = l; i <= r; i++) { up[i] = newup[i]; down[i] = newdown[i]; } }
⭐⭐⭐优化时间复杂度——矩阵快速幂
比如·n=3,l=0,r=2
当长度为2的时候
1 2 3 4 5 6 7 8 9 10 11
up = [0, 1, 2] down = [2, 1, 0] state2 = [ 0, 1, 2, 2, 1, 0 ]
Matrix qpow(Matrix base, int exp){ int n = base.size();
Matrix res(n, vector<int>(n, 0));
for (int i = 0; i < n; i++) { res[i][i] = 1; }
while (exp > 0) { if (exp & 1) { res = mul(res, base); }
base = mul(base, base); exp >>= 1; }
return res; } voidsolve(){ int n, l, r; cin >> n >> l >> r; int m = r - l + 1; Matrix state(2 * m, vector<int>(1, 0)); //int state[2*m][1]={0} Matrix trans(2 * m, vector<int>(2 * m, 0)); //int trans[2*m][2*m]={0} // 长度为 2 的初始状态 // state[0 ... m - 1] 是 up[0 ... m - 1] // state[m ... 2m - 1] 是 down[0 ... m - 1] for (int i = 0; i < m; i++) { state[i][0] = i; state[m + i][0] = m - i - 1; } //求转移矩阵 for (int x = 0; x < m; x++) { // newup[x] = sum(down[y]), y < x for (int y = 0; y < x; y++) { trans[x][ m + y] = 1; //trans[newup][olddown] }
// newdown[x] = sum(up[y]), y > x for (int y = x + 1; y < m; y++) { trans[m + x][y] = 1; //trans[newdown][oldup] } } Matrix p = qpow(trans, n - 2); Matrix finalState = mul(p, state);
int ans = 0; for (int i = 0; i < 2 * m; i++) { ans = (ans + finalState[i][0]) % MOD; } cout << ans << '\n';