LFYZ-OJ ID: 1019 位数问题
位数问题
问题描述
在所有的N位数中,有多少个数中有偶数个数字3?由于结果可能很大,你只需要输出这个答案对12345取余的值。
INPUT
输入一个数N(1<=N<=1000),输入以0结束。
OUTPUT
对于每一个N输出有多少个数中有偶数个数字3。
Sample Input
2
0
Sample Output
73
分析
已知N的最大值为1000,1000位的数字的个数约有101000个,这是个天文数字,故不可能使用枚举法一一统计。本题需使用递推的思想:
设E(n)为n位数中有偶数个3的数字个数,O(n)为n位数中有奇数个3的数字个数。从n位数转变为n+1位数可以在n位数的基础上增加一位:
偶数的英文为“Even”, 奇数的英文为“Odd”,在这里“O(n)”可能会和时间复杂度的概念混淆,小心避免理解出错。
- 如果n位数中有偶数个3,新增一个数位为3,则n+1位数中有奇数个3
- 如果n位数中有偶数个3,新增一个数位为非3,则n+1位数中有偶数个3
- 如果n位数中有奇数个3,新增一个数位为3,则n+1位数中有偶数个3
- 如果n位数中有奇数个3,新增一个数位为非3,则n+1位数中有奇数个3
递推关系用公式表达如下:
E(n+1)=E(n)*9+O(n)=>E(n)=E(n-1)*9+O(n-1)O(n+1)=E(n)+O(n)*9=>O(n)=E(n-1)+O(n-1)*9
1位数有10个:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 数字3中有奇数个(1个)数字3,其它9个数字中有偶数个(0个)数字3,因此E(1)=9, O(1)=1,这就是递推的已知条件,也是我们递推的起点。但在递推的时候,数字的第一位是不能为0的,所以递推到第一位(我们从低位往高位推)时,不是乘9,而是乘8。
当N很大时,数字必定会超过int能够表达的范围从而导致溢出,所以在递归过程中要不断的按照题目要求和12345求余以将数字控制在一定范围内。
通过递推计算,时间复杂度为O(N)。
代码示例
#include<iostream>
using namespace std;
int EVEN[1001], ODD[1001]; //Even存储偶数项,ODD存储奇数项
int main(){
int N, x=9;
scanf("%d", &N);
EVEN[1]=9; //递推起点
ODD[1] =1; //递推起点
for(int i=2; i<=N; i++){
if(i==N) x=8; //递推到最高项时
EVEN[i]=(EVEN[i-1]*x+ODD[i-1])%12345;
ODD[i] =(EVEN[i-1]+ODD[i-1]*9)%12345;
}
printf("%d", EVEN[N]);
}
LFYZ-OJ ID: 1019 位数问题的更多相关文章
- 九度oj题目1019:简单计算器
题目1019:简单计算器 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:6346 解决:2334 题目描述: 读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达 ...
- 九度oj 题目1019:简单计算器
题目描述: 读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值. 输入: 测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之 ...
- 【BZOJ】1019: [SHOI2008]汉诺塔
http://www.lydsy.com/JudgeOnline/problem.php?id=1019 题意:汉诺塔规则,只不过盘子n<=30,终点在B柱或C柱,每一次移动要遵守规则:1.小的 ...
- Twitter的分布式系统中ID生成方法——Snowflake
Twitter-Snowflake算法产生的背景相当简单,为了满足Twitter每秒上万条消息的请求,每条消息都必须分配一条唯一的id,这些id还需要一些大致的顺序(方便客户端排序),并且在分布式系统 ...
- twitter的ID生成器的snowFlake算法的自造版
snowFlake算法在生成ID时特别高效,可参考:https://segmentfault.com/a/1190000011282426 SnowFlake算法生成id的结果是一个64bit大小的整 ...
- poj 1019 Number Sequence 【组合数学+数字x的位宽函数】
题目地址:http://poj.org/problem?id=1019 Number Sequence Time Limit: 1000MS Memory Limit: 10000K Total ...
- 【BZOJ 1019】 [SHOI2008]汉诺塔
[题目链接]:http://www.lydsy.com/JudgeOnline/problem.php?id=1019 [题意] [题解] 这个题解讲得很清楚了 http://blog.sina.co ...
- 常见分布式全局唯一ID生成策略
全局唯一的 ID 几乎是所有系统都会遇到的刚需.这个 id 在搜索, 存储数据, 加快检索速度 等等很多方面都有着重要的意义.工业上有多种策略来获取这个全局唯一的id,针对常见的几种场景,我在这里进行 ...
- 美团分布式ID生成框架Leaf源码分析及优化改进
本文主要是对美团的分布式ID框架Leaf的原理进行介绍,针对Leaf原项目中的一些issue,对Leaf项目进行功能增强,问题修复及优化改进,改进后的项目地址在这里: Leaf项目改进计划 https ...
随机推荐
- Centos7上安装docker (转)
Centos7上安装docker Docker从1.13版本之后采用时间线的方式作为版本号,分为社区版CE和企业版EE. 社区版是免费提供给个人开发者和小型团体使用的,企业版会提供额外的收费服务,比如 ...
- 记录基于VMware虚拟机, Linux7.2下外部主机访问配置
systemctl stop firewalld.service #停止firewall systemctl disable firewalld.service #禁止firewall开机启动
- Android Studio教程08-与其他app通信
目录 1.向另外一个应用发送用户 1.1. 构建隐含Intent 1.2. 验证是否存在接收Intent的应用 1.3. 启动具有Intent的Activity 2. 获取Activity的结果响应 ...
- 【Python 22】52周存钱挑战2.0(列表list和math函数)
1.案例描述 按照52周存钱法,存钱人必须在一年52周内,每周递存10元.例如,第一周存10元,第二周存20元,第三周存30元,直到第52周存520元. 记录52周后能存多少钱?即10+20+30+. ...
- 使用time+dd测试硬盘读写速度
命令:time dd if=/dev/zero bs=1M count=2048 of=direct_2G 此命令为在当前目录下新建一个2G的文件 Demo如下: 写速度: time dd if= ...
- Angular5 路由守卫
今年下半年一直很忙,没有多少时间来写博客,很多笔记都记在了本地一起提交到了git上边. 夏末的时候做的两个vue项目中有接触到vue的路由守卫,今天在另外一个angular上,发现路由守卫有异常,导致 ...
- 在Windows下使用Git+TortoiseGit+码云管理项目代码
1. 安装Git 下载地址:点击打开链接 安装指南:默认选项即可 2. 安装TortoiseGit 下载地址:点击打开链接 安装指南:点击打开链接 3. 在码云创建账号, ...
- golang http自动转为https 如何跳过证书检查
func SendReq(req *http.Request,result interface{}) error { tr := &http.Transport{ TLSClientConfi ...
- 问题记录2019-03-06(todo)
RuntimeError: maximum recursion depth exceeded while calling a Python object
- android9.0系统适配遇到的问题
一.apk在9.0以下的系统上安装运行,没有问题.但是在9.0系统上运行会弹出一个框 解决办法: private void closeAndroidPDialog() { try { Class aC ...