递推算法--位数问题

来源:互联网 发布:打印机网络共享 编辑:程序博客网 时间:2024/05/29 14:06

[问题描述]

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

[输入格式]

读入一个数n。

[输出格式]

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

[输入样例]     [输出样例]

2                     73

[数据范围]

1<=n<=1000

[算法分析]

考虑这种题目,一般来说都是从第i-1位推导第i位,且当前位是取偶数还是取奇数的。

可以用f[i][0]表示前i位取偶数个3有几种情况,f[i][1]表示前i位取奇数个3有几种情况。

则状态转移方程可以表示为

f[i][0]=f[i-1][0]*9+f[i-1][1]   

f[i][1]=(f[i-1][1]*9+f[i-1][0]

边界条件: f[1][1]=1; f[1][0]=9

[参考程序]

#include<iostream>

#include<cstdio>

#include<cstring>

using namespace std;

int main()

{

int f[1001][2],n,i,x;

cin>>n;

f[1][1]=1;f[1][0]=9;

for(i=2;i<=n;i++)

{x=f[1][0];

if(i==n)x--;

f[i][0]=(f[i-1][0]*x+f[i-1][1])%12345;

f[i][1]=(f[i-1][1]*x+f[i-1][0])%12345;

}

 cout<<f[n][0];

 return 0;

}