zoukankan      html  css  js  c++  java
  • 信息学奥赛一本通之递推

    【题目描述】
    在所有的N位数中,有多少个数中有偶数个数字3?由于结果可能很大,你只需要输出这个答案对12345取余的值。

    【输入】
    输入包含一行,一个字符串,长度不超过1000。读入一个数N。

    【输出】
    输出有多少个数中有偶数个数字3。

    【输入样例】
    2

    【输出样例】
    73


    /**
    当位数是1的时候 , 有9个符合条件的。只有1个 数字3 不符合。
    (因为根据题意,含有0个3也是含有偶数个3)
     数字3 是含有奇数个3(不符条件 false)的, 但是 数字33 是含有 偶数个3 (符合条件 true)
    
      也就是说 数字3 在增加了一位数后 变成了符合条件的 数字33。
    
      符合条件的数的个数 为 T[0]
    
      不符合条件的数的个数为 F[0]
    
      T[0] 与 F[1] 是有关联的,我们就需要2个数组。
    
      再由于要记录是第N位数。
    
      所以引入二个数组,T[i] 表示 第 i 位数的时候,符合条件的数的个数;F[i] 表示第 i 位不符合条件的个数
    
      再仔细观察,发现 1(true) 分别和 0,1,2,4,5,6,7,8,9 结合 可以变成 10,11,12,14,15,16,17,18,19 ( true ) (9个)
    
      和 3 结合变成 13 ( false ) (1个)
    
      同理:
    
        3 (false) 与 3 -> 33 (true) (1个)
    
        与除3外的其他数结合 -> (false) (9个)
    
      就可以列出递推式:
    
        T[i] = (T[i-1]*9 + F[i-1])%12345;
        F[i] = (T[i-1] + F[i-1]*K=9)%12345;
    
     等等...然后...
     因为012不构成三位数,也就是说 第 N 位(最后一位的时候),不能把0算进去。
     所以要把 *9 变成 *8
    
     举一个具体的例子:
     N=3,使用地推法。
     当N=1 时,有9个偶数的3(分别是:0 1 2 4 5 6 7 8 9),1个奇数个3(分别是:3)。
     当N=2 时,0不能当十位数 所以时 9*9+1(奇数个3)=82, 18
     当N=3 时,8*82+18=674
     */
    #include <iostream>
    using namespace std;
    long long T[1001],F[1001];
    int N;
    int main(){
        int K = 9;
        cin >> N;
        T[1] = 9;
        F[1] = 1;
        for(int i=2;i<=N;i++){
            if(i==N)
                --K;
            T[i] = (T[i-1]*K + F[i-1])%12345;
            F[i] = (T[i-1] + F[i-1]*K)%12345;
        }
        cout << T[N] << endl;
        return 0;
    }

    当然本题也可以使用排列组合来计算

    加油啦!加油鸭,冲鸭!!!
  • 相关阅读:
    Notification的使用
    Spring面向切面之AOP深入探讨
    使用注解配置Spring框架自动代理通知
    回顾Spring框架
    Spring利器之包扫描器
    Spring 核心概念以及入门教程
    Struts 2之动态方法调用,不会的赶紧来
    Struts2之过滤器和拦截器的区别
    Struts 2开讲了!!!
    Mybatis开篇以及配置教程
  • 原文地址:https://www.cnblogs.com/clarencezzh/p/15758711.html
Copyright © 2011-2022 走看看