zoukankan      html  css  js  c++  java
  • 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 }
    View Code

    2016-10-27  12:06:57 

     

     

  • 相关阅读:
    Java中JDK,JRE和JVM之间的关系-(转载)
    linux(Ubuntu)安装QQ2013(转)
    Java-寻找矩阵连通域个数
    Linux 安装 python IDE
    Java学习笔记-数组与容器间的转制-asList
    由LCS到编辑距离—动态规划入门—算法学习笔记
    Java学习笔记-策略模式
    Java学习笔记-模板方法模式
    Java学习笔记-迭代器模式
    Java学习笔记-Collections.sort详解
  • 原文地址:https://www.cnblogs.com/shadowland/p/6003486.html
Copyright © 2011-2022 走看看