信息学奥赛一本通 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;
}
  • 14
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
4位数码管 TL431电压模块 ///********************************************************************** //基于STC12C4052AD单片机的0-99V数字电压表程序 //ID:abenyao数码之家首发。 //ID:wh307 优化显示,哈哈哈~ //P1.6口为0-5V模拟量输入端,P1.5口连接TL431l输出的2.5V基准电源,4位串行LED数码管显示 //**********************************************************************/ //#include <STC12C2052AD.H> //单片机头文件 //#include <intrins.h> //51基本运算(包括_nop_空函数) //#define uchar unsigned char //#define uint unsigned int //#define LEDBus P3 ////a3.0-b3.1-c3.2-d3.3-e3.4-f3.5-g3.7-dp1.0 //sbit ge=P1^4; //个位位选 //sbit shi=P1^3; //十位位选 //sbit bai=P1^2; //百位位选 //sbit qian=P1^1; //千位位选 //sbit db=P1^0; //char d[5]; //uint R,M,N;//若定义成uchar型就只能显示2.5V以下的数值 //uchar code LEDTab[]={0xc0,0xf9,0x64,0x70,0x59,0x52,0x42,0xf8,0x40,0x58};//应为没有P3.6,所以这里管脚定义和普通的有点区别 //unsigned char port[4]={0xfe,0xfd,0xfb,0xf7}; ///***************************************************************** //函数名:毫秒级CPU延时函数 //调 用:delay (?); //参 数:1~65535(参数不可为0) //返回值:无 //结 果:占用CPU方式延时与参数数值相同的毫秒时间 //备 注:应用于1T单片机时i<600,应用于12T单片机时i<125 ///******************************************************************/ //void delay(uint t) //{ //uint i; //定义变量 //for(;t>0;t--) //如果t大于0,t减1(外层循环) // for(i=600;i>0;i--); //i等于124,如果i大于0,i减1 //} ///******************************************************************* //函数名:ADC初始化及8位A/D转换函数 //返回值:8位的ADC数据 //结 果:读出指定ADC接口的A/D转换值,并返回数值 //备 注:适用于STC12C2052AD系列单片机(必须使用STC12C2052AD.h头文件) //*******************************************************************/ //uchar Read (uchar CHA){ //uchar AD_FIN=0; //存储A/D转换标志;若在函数外定义此变量则不能得到连续变化的模拟量的显示 ///******以下为ADC初始化程序****************************/ // CHA &= 0x07; //选择ADC的8个接口中的一个(0000 0111 清0高5位) // ADC_CONTR = 0x60; //ADC转换的速度(0XX0 0000 其中XX控制速度,请根据数据手册设置) // _nop_(); // ADC_CONTR |= CHA; //选择A/D当前通道 // _nop_(); // ADC_CONTR |= 0x80; //启动A/D电源 // delay(1); //使输入电压达到稳定(1ms即可? ///******以下为ADC执行程序****************************/ // ADC_CONTR |= 0x08; //启动A/D转换(0000 1000 令ADCS = 1) // _nop_(); // _nop_(); // _nop_(); // _nop_(); // while (AD_FIN ==0){ //等待A/D转换结束 // AD_FIN = (ADC_CONTR & 0x10); //0001 0000测试A/D转换结束否 // } // ADC_CONTR &= 0xE7; //1111 0111 清ADC_FLAG位, 关闭A/D转换, //return (ADC_DATA); //返回A/D转换结果(8位) //} ///****************************************************************** //显示函数转换函数: //M=模拟量采样值,N=基准电压源采样值(本为2.5V),R=模拟量输入值(待显示值) //N=256*2.5/Vcc;变形后得Vcc=256*2.5/N; 代入M=256*R/Vcc;得到M=R*N/2.5;变形后得R=M*2.5/N //1为输入端分压比。 //******************************************************************/ //void transfer(void){ //M=Read(6);//P1.6口模拟量转换 //N=Read(5);//P1.5口2.5V基准电压源采样(转换) //R=((M*2.5)/N)*1*1000;//输入模拟量换算并放大1000倍; ///***以下为3位显示转换***/ //d[3]=R/1000; //R=R00; //d[2]=R/100; //R=R0; //d[1]=R/10; //d[0]=R; //} // ///****************************************************************** //函数功能:显示子程序 //********************************************************************/ //void xian_shi (void) //{ // P1=0xfe; //P1.3引脚输出低电平 11111110 // P3=LEDTab[d[0]]; //显示个位 // delay(1); // // P1=0xfd; //P1.2引脚输出低电平 11111101 // P3=LEDTab[d[1]]; //显示十位 // delay(1); // // P1=0xfb; //P1.1引脚输出低电平 // P3=LEDTab[d[2]]; //显示百位 // delay(1); // // P1=0xf7; //P1.0引脚输出低电平 // P3=LEDTab[d[3]]; //显示千位 // delay(1); // // P1=0xff; //关闭所有数码管 // // } // // // ///****************************************************************** //函数名:主函数 //调 用:无 //参 数:无 //返回值:无 //结 果:程序开始处,无限循环 //备 注: //******************************************************************/ //void main (void) //{ //P1M0 = 0x60; //P1.0/P1.1:0000 0011(高阻)//注意:更改ADC通道时须同时将对应的IO接口修改为高阻输入。 //P1M1 = 0x00; //P1.0/P1.1:0000 0000 //while(1){ //uchar i; //delay(1); //i++; //if (i==30) //{ //transfer(); //i=0; //} //xian_shi(); ////delay(10); //} //}
第一章:AVR单片机C语言程序设计概述 1.1 AVR单片机简介 1.2 AVR Studio+WinAVR开发环境安装及应用 1.3 AVR-GCC程序设计基础 1.4 程序与数据内存访问 1.5 I/O端口编程 1.6 外设相关寄存器及应用 1.7 中断服务程序 1.8 GCC在AVR单片机应用系统开发中的优势 第二章:PROTEUS操作基础 2.1 PROTEUS操作界面简介 2.2 仿真电路原理图设计 2.3 元件选择 2.4 仿真运行 2.5 PROTEUS与AVR Studio的联合调试 2.6 PROTEUS在AVR单片机应用系统开发中的优势 第三章:基础程序设计 3.1 闪烁的LED 3.2 左右来回的流水灯 3.3 花样流水灯 3.4 LED模拟交通灯 3.5 单只数码管循环显示0~9 3.6 8只数码管滚动显示单个数字 3.7 8只数码管显示多个不同字符 3.8 K1~K4控制LED移位 3.9 数码管显示4×4键盘矩阵按键 3.10 数码管显示拨码开关编码 3.11 继电器控制照明设备 3.12 开关控制报警器 3.13 按键发音 3.14 INT0中断计数 3.15 INT0及INT1中断计数 3.16 TIMER0控制单只LED闪烁 3.17 TIMER0控制的流水灯 3.18 TIMER0控制数码管扫描显示 3.19 TIMER1控制交通指示灯 3.20 TIMER1与TIMER2控制十字路口秒计时显示屏 3.21 用工作于计数方式的T/C0实现100以内的按键计数 3.22 用定时器设计的门铃 3.23 报警器与旋转灯 3.24 100000秒以内的计时程序 3.25 用TIMER1输入捕获功能设计的频率计 3.26 用工作于异步模式的T/C2控制的可调式数码管电子钟 3.27 TIMER1定时器比较匹配中断控制音阶播放 3.28 用TIMER1输出比较功能调节频率输出 3.29 TIMER1控制的PWM脉宽调制器 3.30 数码管显示两路A/D转换结果 3.31 模拟比较器测试 3.32 EEPROM读写与数码管显示 3.33 Flash程序空间中的数据访问 3.34 单片机与PC机双向串口通讯仿真 3.35 看门狗应用 第四章:硬件应用 4.1 74HC138与74HC154译码器应用 4.2 74HC595串入并出芯片应用 4.3 用74LS148与74LS21扩展中断 4.4 62256扩展内存 4.5 用8255实现接口扩展 4.6 可编程接口芯片8155应用 4.7 可编程外围定时计数器8253应用 4.8 数码管BCD解码驱动器7447与4511应用 4.9 8×8LED点阵屏显示数字 4.10 8位数码管段位复用串行驱动芯片MAX6951应用 4.11串行共阴显示驱动器MAX7219与7221应用 4.12 16段数码管演示 4.13 16键解码芯片74C922应用 4.14 1602字符液晶测试程序 4.15 1602液晶显示DS1302实时时钟 4.16 1602液晶工作于四位模式实时显示当前时间 4.17 2×20串行字符液晶演示 4.18 LGM12864液晶显示程序 4.19 PG160128A液晶图文演示 4.21 TG126410液晶串行模式演示 4.21 用带SPI接口的MCP23S17扩展16位通用IO端口 4.22 用TWI接口控制MAX6953驱动4片5×7点阵显示器 4.23 用TWI接口控制MAX6955驱动16段数码管显示 4.24 用DAC0832生成多种波形 4.25 用带SPI接口的数模转换芯片MAX515调节LED亮度 4.26 正反转可控的直流电机 4.27正反转可控的步进电机 4.28 DS18B20温度传感器测试 4.29 SPI接口温度传感器TC72应用测试 4.30 SHT75温湿度传感器应用 4.31 用SPI接口读写AT25F1024 4.32 用TWI接口读写24C04 4.33 MPX4250压力传感器测试 4.34 MMC存储卡测试 4.35 红外遥控发射与解码仿真 第五章:综合设计 5.1 多首电子音乐的选播 5.2 电子琴仿真 5.3 普通电话机拨号键盘应用 5.4 手机键盘仿真 5.5 数码管模拟显示乘法口诀 5.6 用DS1302与数码管设计的可调电子钟 5.7 用DS1302与LGM12864设计的可调式中文电子日历 5.8 用PG12864LCD设计的指针式电子钟 5.9 高仿真数码管电子钟 5.10 1602LCD显示的秒表 5.11 用DS18B20与MAX6951驱动数码管设计的温度报警器 5.12 用1602LCD与DS18B20设计的温度报警器 5.13 温控电机在L298驱动下改变速度与方向运行 5.14 PG160128中文显示日期时间及带刻度显示当前温度 5.15 液晶屏曲线显示两路模数转换结果 5.16 用74LS595与74LS154设计的16×16点阵屏 5.17 用8255与74LS154设计的16×16点阵屏 5.18 8×8LED点阵屏仿电梯数字滚动显示 5.19 用内置EEPROM与1602液晶设计的MD5加密电子密码锁 5.20 12864LCD显示24C08保存的开机画面 5.21 12864LCD显示EPROM27C256保存的开机画面 5.22 IIC-AT24C1024×2硬字库应用 5.23 SPI-AT25F2048硬件字库应用 5.24 带液晶显示的红外遥控调速仿真 5.25 能接收串口信息的带中英文硬字库的80×16点阵显示屏 5.26 用AVR与1601LCD设计的计算器 5.27 电子秤仿真设计 5.28 模拟射击训练游戏 5.29 PC机通过485远程控制单片机 5.30 用IE访问AVR+RTL8019设计的以太网应用系统
信息学奥赛一本通 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、付费专栏及课程。

余额充值