1 条题解
-
0
自动搬运
来自洛谷,原作者为

一只书虫仔
End.搬运于
2025-08-24 22:27:10,当前版本为作者最后更新于2020-11-08 13:28:27,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
$$\color{Orange}\sf dWoi\ Round\ 1\ B\ Password\ of\ Shady $$
Description
求有多少个 位无前导零的数满足所有数位中有偶数个 。
,,Subtask 1
约束条件:。
一位数只有 ,,所以肯定输出 。
Subtask 2
约束条件:。
留给了爆搜或者写挂没开 long long 的正解。
然后发现暴力貌似是 或者 的Subtask 3
约束条件:。
考虑动态规划。
对于一个满足要求的 位数,可以由一个不满足要求的 位数加上一位 或者由一个满足要求的 位数加上一位除了 之外的数位得来,同理,对于一个不满足要求的 位数,可以由一个满足要求的 位数加上一位 或者由一个不满足要求的 位数加上一位除了 之外的数得来。
因此我们可以开两个数组 , 构造满足要求的 位数, 构造不满足要求的 位数,按照我们上面分析的,转移方程也就出来了:
对于初值,注意特判 ,。
另外, 时也要特判。
然后你就得到了 的优秀解法,
但并 A 不了。你也可以尝试矩阵快速幂,听 lgd 说是 ,
但好像也 A 不了。Subtask 4
考虑初始化,把 的答案提前初始化到输出 里,然后每次循环输入 直接输出 即可。
然后你就得到了 的优秀 AC 做法。
Code
#include <bits/stdc++.h> using namespace std; unsigned long long f[100005]; unsigned long long g[100005]; int main () { int t; scanf("%d", &t); f[1] = 8, g[1] = 1; for (int i = 2; i <= 100000; i++) { f[i] = f[i - 1] * 9 + g[i - 1]; g[i] = g[i - 1] * 9 + f[i - 1]; f[i] %= 998244353; g[i] %= 998244353; } while (t--) { int n, k; scanf("%d%d", &n, &k); if (n == 1) { puts("9"); continue; } printf("%llu\n", f[n] % 998244353); continue; } return 0; }
- 1
信息
- ID
- 6007
- 时间
- 500ms
- 内存
- 128MiB
- 难度
- 2
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者