P7158
传送门:P7158
本题考虑动态规划,很明显我们需要一个 左右的动态规划。
首先我们可以对数进行分析,假设有 ,那么对于第 位,有 种方法,就是 到 中少去掉一个 ,假设 已经有 种成立方法,有 种不成立方法,那么 应该是 ,也就是说每一种成立的方法拓展出 种新的,那种不成立的(假设为 ),那么加上一个 就有 ,只有 种。
假设常量 ,有转移方程:
另外,这道题与 的值无关,也就是说对于一个确定的 ,无论 取何值,答案一样。
代码(注意要加预处理):
#include <cstdio>
#include <cstring>
using namespace std;
#define int long long
const int N = 1e5 + 5, MOD = 998244353;
int ok[N], no[N];
signed main()
{
ok[1] = 8;
no[1] = 1;
for (int i = 2; i <= 1e5; i++)
{
ok[i] = (ok[i - 1] * 9 + no[i - 1]) % MOD;
no[i] = (no[i - 1] * 9 + ok[i - 1]) % MOD;
}
int t;
scanf("%lld", &t);
while (t--)
{
int n, k;
scanf("%lld %lld", &n, &k);
if (n == 1)
{
printf("9\n");
continue;
}
printf("%lld\n", ok[n]);
}
return 0;
}