XDOJ1260 - 递推1

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;
}


你可能感兴趣的:(XDOJ1260 - 递推1)