NOI 题库 9272 题解
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.
1 #include "bits/stdc++.h" 2 3 using namespace std ; 4 const int maxN = 1e3 + 1e2 ; 5 const int MOD = 12345 ; 6 typedef long long QAQ ; 7 8 int f[ maxN ][ 2 ] ; 9 10 int main ( ) { 11 std::ios::sync_with_stdio( false ) ; 12 int N , X = 9 ; 13 cin >> N ; 14 f[ 1 ][ 1 ] = 9 ; 15 f[ 1 ][ 0 ] = 1 ; 16 for ( int i=2 ; i<=N ; ++i ) { 17 if ( i == N ) --X ; 18 f[ i ][ 1 ] = f [ i - 1 ][ 1 ] * X + f[ i - 1 ][ 0 ] * 1 ; 19 f[ i ][ 0 ] = f [ i - 1 ][ 0 ] * X + f[ i - 1 ][ 1 ] * 1 ; 20 f[ i ][ 1 ] %= MOD ; 21 f[ i ][ 0 ] %= MOD ; 22 } 23 cout << f[ N ][ 1 ] << endl ; 24 return 0 ; 25 }
2016-10-27 12:06:57