题目大意
编程求出所有的 n n n 位数中,有多少个数中有偶数个数字 3 3 3。
0 < n < 1000 0 < n < 1000 0<n<1000
说明:
- 一位数有 9 9 9 个: 1 、 2 、 3 、 4 、 5 、 6 、 7 、 8 、 9 1、2、3、4、5、6、7、8、9 1、2、3、4、5、6、7、8、9。
- 0 0 0 不是一位数。
- 0 0 0 为什么不是一位数?原因参考于《九年义务教育六年制小学数学第八册教师教学用书》。
- 包含偶数个 3 3 3 可以为包含 0 0 0 个 3 3 3。
解题思路
一道显然的数论题。
首先设 f i f_i fi 为 i i i 位数中有奇数个数字 3 3 3 的数的个数,设 a i a_i ai 为 i i i 位数中有偶数个数字 3 3 3 的数的个数。
显然我们可以从前一个状态推出当前的状态。
即在前一个状态的后面加上一个数。
即如果在原来有奇数个 3 3 3 的数后加上 3 3 3 就是当前的偶数个数字 3 3 3 的数,方案数为 f i − 1 f_{i-1} fi−1。
如果在原来有偶数个 3 3 3 的数后加上 3 3 3 就是当前的奇数个数字 3 3 3 的数,方案数为 a i − 1 a_{i-1} ai−1。
如果在原来有奇数个 3 3 3 的数后加上不为 3 3 3的数字就是当前的奇数个数字 3 3 3 的数,方案数为 9 ∗ f i − 1 9*f_{i-1} 9∗fi−1。
如果在原来有偶数个 3 3 3 的数后加上不为 3 3 3的数字就是当前的偶数个数字 3 3 3 的数,方案数为 9 ∗ a i − 1 9*a_{i-1} 9∗ai−1。
则有转移方程:
f i = 9 ∗ f i − 1 + a i − 1 f_i=9*f_{i-1}+a_{i-1} fi=9∗fi−1+ai−1
a i = 9 ∗ a i − 1 + f i − 1 a_i=9*a_{i-1}+f_{i-1} ai=9∗ai−1+fi−1
AC CODE
#include <bits/stdc++.h>
#define int long long
using namespace std;
long long n;
long long f[100005], a[100005];
long long mod = 12345;
signed main()
{
scanf("%lld", &n);
f[1] = 1;
a[1] = 8;
f[2] = 17;
a[2] = 73;
for(int i = 3; i <= n; ++i)
{
f[i] = f[i - 1] % mod * 9 % mod + a[i - 1] % mod;
f[i] %= mod;
a[i] = a[i - 1] % mod * 9 % mod + f[i - 1] % mod;
a[i] %= mod;
}
printf("%lld", a[n] % 12345);
return 0;
}