有一个长度为n的字符串,字符串仅包含'0'-'9'。 现在要把这个字符串切割成若干个子串,每个子串作为一个十进制的数,能被3整除,且不含前导0。 问有多少种切割的方案。由于答案可能很大,请输出mod 998244353 后的结果。
时间: 2023-02-22 13:36:51 浏览: 81
给定一个只包含数字[0…9]的字符串,请使用字符中的某些字符,构建一个能够整除15的最大整数,注意字符中的每个字符只能使用一次
这是一道字符串切割问题,要求把一个长度为n的字符串切割成若干个十进制数,每个数能被3整除,不含前导0,并且输出答案对 998244353 取模的结果。
这类问题常见的做法是动态规划,可以使用一个数组dp记录所有的可能方案数,dp[i]表示前i个字符的切割方案数,最后的答案即为dp[n]。
在动态规划过程中,我们遍历字符串的每一个位置,并从该位置向后枚举不超过3位的数字,如果满足条件(能被3整除,不含前导0),就可以更新dp数组。
最终的dp数组的更新方程为:
dp[i] = (dp[i] + dp[j]) % 998244353
其中,j是当前枚举的数字的末尾位置,即j = i - len + 1,len是当前枚举的数字的长度。
因此,本题的完整代码实现如下:
```
const int mod = 998244353;
int dp[100010];
char s[100010];
int n;
bool check(int l, int r) {
if (s[l] == '0') return false;
int sum = 0;
for (int i = l; i <= r; i++) {
sum = (sum * 10 + s[i] - '0') % 3;
}
return sum == 0;
}
int main() {
scanf("%s", s + 1);
n = strlen(s + 1);
dp[0] = 1;
for (int i = 1; i <= n; i++) {
for (int len = 1; len <= 3 && i >= len;
阅读全文