信息学奥赛一本通 1313:【例3.5】位数问题

【题目链接】

ybt 1313:【例3.5】位数问题

【题目考点】

1. 递推

【解题思路】

M = 12345 M=12345 M=12345
a[i]表示i位数的数字中,有偶数个3的数字的数量对M取模。
b[i]表示i位数的数字中,有奇数个3的数字的数量对M取模。

  • 1位数只有数字 3 3 3包含1个3,也就是奇数个3。其余9个数字都只包含0个3,也就是偶数个3。
    那么a[1]=9 表示在1位数中有9个数字有偶数个3, b[1] = 1 表示在1位数中有1个数字有奇数个3。
  • 2位数,就是在1位数前面添加一位数字。
  • 假设n>2,即第2位不是最高位。
    那么2位数字有偶数个3的情况有:
    第一位为3第二位为3: 1 ∗ 1 = 1 1 * 1=1 11=1
    第一位不为3第二位不为3: 9 ∗ 9 = 81 9 * 9 = 81 99=81
    一共有82种情况,所以 a [ 2 ] = 82 a[2] = 82 a[2]=82,表示在2位数中,有82个数字有偶数个3。
    同理: b [ 2 ] = 1 ∗ 9 + 9 ∗ 1 = 18 b[2] = 1 * 9 + 9 * 1 = 18 b[2]=19+91=18 ,表示在2位数中,有18个数字有奇数个3

考虑一般情况,假设i<n。在一个i-1位数字前面添加第i位,可能添加数字 3 3 3,有1种情况;也可能不为 3 3 3,有9种情况。
原i-1位数有偶数个3的情况有a[i-1]种,原i-1位数有奇数个3的情况有b[i-1]种
要想让这个i位数字有偶数个3,可能的情况有:

  • 原i-1位数有偶数个3,新添加的数字不是3。共有a[i-1]*9种情况。
  • 原i-1位数有奇数个3,新添加的数字是3。共有b[i-1]种情况。

所以a[i] = a[i-1]*9+b[i-1];
要想让这个i位数字有奇数个3,可能的情况有:

  • 原i-1位数有奇数个3,新添加的数字不是3。共有b[i-1]*9种情况。
  • 原i-1位数有偶数个3,新添加的数字是3。共有a[i-1]种情况。

所以b[i] = b[i-1]*9+a[i-1];
由于最高位不能为0,所以在面对第n位,添加不是3的数字时,只有8种情况。需要把上面两式中的9变为8。

【题解代码】

解法1:递推
#include <bits/stdc++.h>
using namespace std;
#define N 1005
#define M 12345
int main()
{
    int a[N], b[N], n, x = 9;
    a[1] = 9, b[1] = 1;//如果只有1位数字,有偶数个3的数字个数确实为9,因为包括了0。如果不是1位数字,最高位不能为0。 
    cin >> n;
    for(int i = 2; i <= n; ++i)
    {
        if(i == n)//最后一次添加数字,添加的是最高位数字,不能添加0,所以不添加3的情况只有8种
            x--;
        a[i] = (a[i-1]*x + b[i-1])%M;
        b[i] = (a[i-1] + b[i-1]*x)%M;
    }
    cout << a[n];
    return 0;
}
  • 15
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
信息学奥赛一本通 1313》是一道题目,可以在http://ybt.ssoier.***N位数,要求计算出在所有的N位数中,有多少个数中有偶数个数字3,并输出对12345取余的值。 根据题目描述,可以使用动态规划的思想解决这个问题。假设i<n,对于一个i-1位数,有a[i-1]种情况下原有偶数个3,有b[i-1]种情况下原有奇数个3。那么对于i位数,有a[i-1]*9种情况下原有偶数个3且新添加的数字不是3,有b[i-1]种情况下原有奇数个3且新添加的数字是3。 通过递推的方式,可以得到最终的结果。最后将结果对12345取余就可以得到题目要求的答案。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [信息学奥赛一本通1313:【3.5位数问题)](https://blog.csdn.net/lvcheng0309/article/details/117651851)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [信息学奥赛一本通 1313:【3.5位数问题](https://blog.csdn.net/lq1990717/article/details/123793937)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值