1313:【例3.5】位数问题

1313:【例3.5】位数问题

  • 【题目描述】
  • 【输入】
  • 【输出】
  • 【输入样例】
  • 【输出样例】
  • 杂谈
  • 代码

时间限制: 1000 ms 内存限制: 65536 KB
提交数: 24198 通过数: 13291

【题目描述】

在所有的N位数中,有多少个数中有偶数个数字3?由于结果可能很大,你只需要输出这个答案对12345取余的值。

【输入】

读入一个数N(N≤1000)。

【输出】

输出有多少个数中有偶数个数字3。

【输入样例】

2

【输出样例】

73

杂谈

定义数组ans[N][2]来保存答案
ans[k][0],ans[k][1]分别表示k位数中含偶数个3的个数(包含含0个3)和含奇数个3的数的个数
显然ans[1][0]=9 (0,1,2,3,4,5,6,7,8,9)
ans[2][0]=1 (3)
对于k位数(暂时不考虑首位不为零),其含偶数个三的数的情况:0,1,2,4,5,6,7,8,9 分别与k-1位数中偶数个三的数组合的个数加上3与k-1位数中含奇数个三的数组合
其含奇数个三的数的情况:0,1,2,4,5,6,7,8,9分别与k-1位数中含奇数个三的数组合加上3与k-1位数中含偶数个三的数组合
故ans[k][0]=9ans[k-1][0]+ans[k-1][1];
ans[k][1]=9
ans[k-1][1]+ans[k-1][0];
现在考虑首位不为零
令n1
则有
ans[n][0]=9ans[n-1][0]+ans[n-1][1];
ans[n][1]=9
ans[n-1][1]+ans[n-1][0];

ans[k][0]=8ans[k-1][0]+ans[k-1][1];
ans[k][1]=8
ans[k-1][1]+ans[k-1][0];

代码

#include
using namespace std;
const int N=1e+3+1;
const int NUM=12345;
int main () {
	int i,n;
	int ans[N][2]={0};
	ans[1][0]=9;//一位数含偶数个三的情况的数的情况:0,1,2,4,5,6,7,8,9
	ans[1][1]=1;//一位数含奇数个三的情况的数的情况:3
    scanf("%d",&n);
    for (i=2;i<n;i++) {
		ans[i][0]=(9*ans[i-1][0]+ans[i-1][1])%NUM;
		ans[i][1]=(9*ans[i-1][1]+ans[i-1][0])%NUM;
	}
	ans[i][0]=(8*ans[i-1][0]+ans[i-1][1])%NUM;
	printf("%d",ans[n][0]);
	return 0;
}

你可能感兴趣的:(一本通,算法,c++)