Sequence
ps:分段矩阵快速幂,因为P范围内只有√P段是不同的。写出的BUG:矩阵讲究左乘和右乘;取模较多可能会T,因为模运算很耗时;除法可能会除到0;只在3 ~ n的范围内分段,注意某段的端点是否大于n。
int temp[3][3] = {{0, 0, 0}, {1, 0, 0}, {0, 0, 1} }; node mTemp; void Inite() { mTemp.A[0][0] = D; mTemp.A[0][1] = C; mTemp.A[0][2] = 0; for (int i = 1; i < 3; ++i) { for (int j = 0; j < 3; ++j) mTemp.A[i][j] = temp[i][j]; } } void solve() { node ans; for (int i = 0; i < 3; ++i) ans.A[i][i] = 1; // i 是左端点, y 是右端点 Inite(); for (int i = 3, x, y; i <= n; i = y + 1) { x = P / i; y = (x == 0 ? n : P / x); if (y > n) y = n; mTemp.A[0][2] = x; ans = Fastpow(mTemp, y - i + 1) * ans; } ll res = ((ans.A[0][0] * (ll)B) % mod + (ans.A[0][1] * (ll)A) % mod + (ll)ans.A[0][2]) % mod; cout << res << endl; }