位数问题

问题描述

在所有的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 位数问题的更多相关文章

  1. 九度oj题目1019:简单计算器

    题目1019:简单计算器 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:6346 解决:2334 题目描述:     读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达 ...

  2. 九度oj 题目1019:简单计算器

    题目描述:     读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值. 输入:     测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之 ...

  3. 【BZOJ】1019: [SHOI2008]汉诺塔

    http://www.lydsy.com/JudgeOnline/problem.php?id=1019 题意:汉诺塔规则,只不过盘子n<=30,终点在B柱或C柱,每一次移动要遵守规则:1.小的 ...

  4. Twitter的分布式系统中ID生成方法——Snowflake

    Twitter-Snowflake算法产生的背景相当简单,为了满足Twitter每秒上万条消息的请求,每条消息都必须分配一条唯一的id,这些id还需要一些大致的顺序(方便客户端排序),并且在分布式系统 ...

  5. twitter的ID生成器的snowFlake算法的自造版

    snowFlake算法在生成ID时特别高效,可参考:https://segmentfault.com/a/1190000011282426 SnowFlake算法生成id的结果是一个64bit大小的整 ...

  6. poj 1019 Number Sequence 【组合数学+数字x的位宽函数】

    题目地址:http://poj.org/problem?id=1019 Number Sequence Time Limit: 1000MS   Memory Limit: 10000K Total ...

  7. 【BZOJ 1019】 [SHOI2008]汉诺塔

    [题目链接]:http://www.lydsy.com/JudgeOnline/problem.php?id=1019 [题意] [题解] 这个题解讲得很清楚了 http://blog.sina.co ...

  8. 常见分布式全局唯一ID生成策略

    全局唯一的 ID 几乎是所有系统都会遇到的刚需.这个 id 在搜索, 存储数据, 加快检索速度 等等很多方面都有着重要的意义.工业上有多种策略来获取这个全局唯一的id,针对常见的几种场景,我在这里进行 ...

  9. 美团分布式ID生成框架Leaf源码分析及优化改进

    本文主要是对美团的分布式ID框架Leaf的原理进行介绍,针对Leaf原项目中的一些issue,对Leaf项目进行功能增强,问题修复及优化改进,改进后的项目地址在这里: Leaf项目改进计划 https ...

随机推荐

  1. vue 组件开发、vue自动化工具、axios使用与router的使用(3)

    一. 组件化开发 1.1 组件[component] 在网页中实现一个功能,需要使用html定义功能的内容结构,使用css声明功能的外观样式,还要使用js定义功能的特效,因此就产生了一个功能先关的代码 ...

  2. Java 8 中为什么要引出default方法

    (原) default方法是java 8中新引入进的,它充许接口中除了有抽象方法以外,还可以拥用具有实现体的方法,这一点跟jdk8之前的版本已经完全不一样了,为什么要这样做呢? 拿List接口举例,在 ...

  3. [已决解]关于Hadoop start-all.sh启动问题

    问题一:出现Attempting to operate on hdfs namenode as root 写在最前注意: 1.master,slave都需要修改start-dfs.sh,stop-df ...

  4. 11-page分页原理

    创建一个分页对象PageBean<T>来存储分页信息+实体信息, 客户端请求时传递分页信息, 服务端将实体信息+分页信息放进分页对象返回给客户端. 实例如下: listStudent.js ...

  5. (七)Create an Index

    Now let’s create an index named "customer" and then list all the indexes again: 现在让我们创建一个名 ...

  6. 2019-04-15 python深浅复制

    原作地址:https://www.cnblogs.com/xueli/p/4952063.html 在python中,对象赋值实际上是对象的引用.当创建一个对象,然后把它赋给另一个变量的时候,pyth ...

  7. 想了解SAW,BAW,FBAR滤波器的原理?看这篇就够了!

    想了解SAW,BAW,FBAR滤波器的原理?看这篇就够了!   很多通信系统发展到某种程度都会有小型化的趋势.一方面小型化可以让系统更加轻便和有效,另一方面,日益发展的IC**技术可以用更低的成本生产 ...

  8. C# FileSystemWatcher 并发

    using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threa ...

  9. 【转】详解springboot-修改内置tomcat版本

    1.解析Spring Boot父级依赖 <parent> <groupId>org.springframework.boot</groupId> <artif ...

  10. SpringCloud(6)分布式配置中心Spring Cloud Config

    1.Spring Cloud Config 简介 在分布式系统中,由于服务数量巨多,为了方便服务配置文件统一管理,实时更新,所以需要分布式配置中心组件.在Spring Cloud中,有分布式配置中心组 ...