【例3.5】位数问题(信息学奥赛一本通-1313)
【题目描述】
在所有的N位数中,有多少个数中有偶数个数字3?由于结果可能很大,你只需要输出这个答案对12345取余的值。
【输入】
读入一个数N(N≤1000)。
【输出】
输出有多少个数中有偶数个数字3。
【输入样例】
2
【输出样例】
73
【题解代码】
#include<bits/stdc++.h>
using namespace std;
/*
1位数时 2位数时 3位数时
奇数个3的个数 odd[1]=1 odd[2]=9*odd[1]+1*even[1] odd[2]=9*odd[1]+1*even[1]
偶数个3的个数 even[1]=9 even[2]=1*odd[1]+9*even[1] even[2]=1*odd[1]+9*even[1]
*/
/*
边界条件:odd[1]=1
even[1]=9
递推关系式:odd[i] = 9 * odd[i - 1] + 1 * even[i - 1];
even[i] = 1 * odd[i - 1] + 9 * even[i - 1];
注意:最高位不能为0(即i=n时)
*/
const int N = 1e3 + 10;
int odd[N], even[N];
int main()
{
int n; cin >> n;
odd[1] = 1, even[1] = 9;
for (int i = 2; i <= n; i++)
{
if (i == n) //最高位不能为0
{
odd[i] = (8 * odd[i - 1] + 1 * even[i - 1]) % 12345;
even[i] = (1 * odd[i - 1] + 8 * even[i - 1]) % 12345;
}
else
{
odd[i] = (9 * odd[i - 1] + 1 * even[i - 1]) % 12345;
even[i] = (1 * odd[i - 1] + 9 * even[i - 1]) % 12345;
}
}
cout << even[n];
return 0;
}