P7158

传送门:P7158

本题考虑动态规划,很明显我们需要一个 O(n)O(n) 左右的动态规划。

首先我们可以对数进行分析,假设有 abcd\overline{abcd},那么对于第 55 位,有 99 种方法,就是 0099 中少去掉一个 kk,假设 abcd\overline{abcd} 已经有 w4w_4 种成立方法,有 p4p_4 种不成立方法,那么 w5w_5 应该是 9×w4+p49 \times w_4 + p_4,也就是说每一种成立的方法拓展出 99 种新的,那种不成立的(假设为 qwer\overline{qwer}),那么加上一个 kk 就有 qwerk\overline{qwer \,\,\,k},只有 11 种。

假设常量 L=998244353L = 998244353,有转移方程:

wi={8i=1(wi1×9+pi1) modLi2\Large w_i = \begin{cases} 8 & i = 1 \\ (w_{i-1} \times 9+ p_{i - 1}) \bmod L& i \ge 2 \end{cases}

pi={1i=1(pi1×9+wi1) modLi2\Large p_i = \begin{cases} 1 & i = 1 \\ (p_{i-1} \times 9+ w_{i - 1})\bmod L & i \ge 2 \end{cases}

另外,这道题与 kk 的值无关,也就是说对于一个确定的 nn,无论 kk 取何值,答案一样。

代码(注意要加预处理):

#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;
}
posted @   HappyBobb  阅读(9)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示