XDOJ1260 - 递推1

来源:互联网 发布:大掌柜软件官网 编辑:程序博客网 时间:2024/05/08 16:11
Description

 在所有的N位数中,有多少个数中有偶数个数字3?

Input
多组数据,每行一个数N(N<=1000)
Output
每行输出一个数,答案mod12345
Sample Input
2
Sample Output
73
解题思路:
源于网上,自己太菜T_T。
以f(n,0)表示n位数中偶数个3的数字有多少,f(n,1)表示n位数中奇数个3的数字有多少。
其中f(1,0)=8(为了递推方便去掉了0,因为0不能做一个多位数的第一位),f(1,1)=1
考虑n的情况,n位数可以通过在n-1位数的最后面添加一位(0~9)得到,如果添加的是3,那么n-1位中原来奇数个3的数变成偶数个3,原来偶数个3的变成奇数个3;如果添加不是3,那么3的奇偶性不变。
所以
f(n,0) = 9*f(n-1,0)+f(n-1,1)
f(n,1) = 9*f(n-1,1)+f(n-1,0)
#include<iostream>using namespace std;const int INF = 1000000000;const int M = 12345;const int D = 1000;long long f[D+1][2];void init(){    f[1][0] = 8;    f[1][1] = 1;    for(int i=2;i<=D;++i)    {        f[i][0] = f[i-1][1]+9*f[i-1][0];        f[i][1] = f[i-1][0]+9*f[i-1][1];        if(f[i][0]>INF)            f[i][0]%=M;        if(f[i][1]>INF)            f[i][1]%=M;    }}int main(){    int n;    init();    while(cin>>n)    {        if(n==1)            cout<<9<<endl;        else            cout<<f[n][0]%M<<endl;    }    return 0;}


0 0
原创粉丝点击