在所有的N 位数中,有多少个数中有偶数个数字3?由于结果可能很大,你只需要输出这个答案对12345 取余的值。c++
时间: 2024-02-15 10:04:35 浏览: 83
可以使用动态规划来求解该问题。具体来说,设 $f(i,j,k,l)$ 表示考虑到第 $i$ 位,数字 3 出现了 $j$ 次,当前有 $k$ 个数字,当前已经确定的数字中有偶数个 3 的方案数,其中 $l$ 表示当前数字是否达到上限。则有以下状态转移方程:
$$
f(i,j,k,l)=\sum_{p=0}^{9}f(i-1,j+(p==3),k+1,(l\ \text{and}\ p==d_i)\ \text{or}\ (p<d_i))
$$
其中 $d_i$ 表示第 $i$ 位上的数字。边界条件为 $f(0,0,0,1)=1$,表示考虑到第 0 位,数字 3 出现了 0 次,当前有 0 个数字,当前已经确定的数字中有偶数个 3 的方案数为 1。
最终的答案为 $f(n,0,0,1)-1$,表示考虑到第 $n$ 位,数字 3 出现了 0 次,当前有 0 个数字,当前已经确定的数字中有偶数个 3 的方案数,并且不能超过上限的方案数减去 1(减去 1 是为了去掉全是 0 的情况)。
以下是 C++ 代码实现:
```cpp
#include <iostream>
using namespace std;
const int MOD = 12345;
int f[11][101][11][2];
int main() {
int n;
cin >> n;
for (int i = 0; i <= 9; i++) {
f[0][0][0][1] = 1;
}
for (int i = 1; i <= n; i++) {
for (int j = 0; j <= 100; j++) {
for (int k = 0; k <= 9; k++) {
for (int l = 0; l <= 1; l++) {
for (int p = 0; p <= 9; p++) {
int nj = j + (p == 3);
int nk = k + 1;
int nl = (l && (p == (i % 10))) || (p < (i % 10));
f[i][nj][nk][nl] = (f[i][nj][nk][nl] + f[i - 1][j][k][l]) % MOD;
}
}
}
}
}
int ans = f[n][0][0][1] - 1;
cout << ans << endl;
return 0;
}
```
阅读全文