NOI 题库 9272 题解

时间:2023-07-16 10:16:20

9272   偶数个数字3

描述

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

输入

一行给出数字N,N<=1000

输出

如题

样例输入
2
样例输出
73

Solution :

令f ( i , 0 )表示 i 位数中有奇数个 3 的个数.

令f ( i , 1 )表示 i 位数中有偶数个 3 的个数.

这里的 i 位数是广义的 i 位数,即可能含有前导 0 .

不难发现 , 在有偶数个3的数前加入除3以外的数,即 0 , 1 , 2 , 4 , 5 , 6 , 7 , 8 , 9 它还是有偶数个3.

在有奇数个3的前加入一个3,有且仅有加入一个3的情况,使它成为偶数个3的数.

在有奇数个3的数前加入除3以为的数,即 0 , 1 , 2 , 4 , 5 , 6 , 7 , 8 , 9 它还是有奇数个3.

在有偶数数个3的前加入一个3,有且仅有加入一个3的情况,使它成为奇数个3的数.

依据上述思路,得到递推方程:

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

[ATTENTION] : 当 i == n 时 前面不能加入0.

 #include "bits/stdc++.h"

 using namespace std ;
const int maxN = 1e3 + 1e2 ;
const int MOD = ;
typedef long long QAQ ; int f[ maxN ][ ] ; int main ( ) {
std::ios::sync_with_stdio( false ) ;
int N , X = ;
cin >> N ;
f[ ][ ] = ;
f[ ][ ] = ;
for ( int i= ; i<=N ; ++i ) {
if ( i == N ) --X ;
f[ i ][ ] = f [ i - ][ ] * X + f[ i - ][ ] * ;
f[ i ][ ] = f [ i - ][ ] * X + f[ i - ][ ] * ;
f[ i ][ ] %= MOD ;
f[ i ][ ] %= MOD ;
}
cout << f[ N ][ ] << endl ;
return ;
}

2016-10-27  12:06:57