51nod- 【1042 数字0-9的数量 】
题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1042
两个数a,b(1 <= a <= b <= 10^18)
输出共10行,分别是0-9出现的次数
10 19
1
11
1
1
1
1
1
1
1
1 题解: 求区间[a,b]各位数字出现次数并打印输出。
因为数据是10^18,暴力会T。
所以应该要找出出现的规律,优化算法。 从个位开始分析各个数位。
不妨把当前数位右侧的数都当作0来统计: 1、当前数位(cur):那么当前数位从1开始到cur,当前数位每增大1,这个数字出现次数是当前数位的权值value(如从11增大到12时,个位上1出现了value = 1次;从110增大到120时,十位上的1出现了value = 10次) 2、当前数位左边的数(res)也会影响当前数位:res每增大1,当前数位的数都会从0-9走遍历一遍,其中每次遍历在0-9的每个数字上产生的次数为value次。(如12300这个数,res = 123 ,value = 10,十位上的0-9产生的总次数均为 res * value = 1230 次) 3、当前数位还会影响当前数位左边的数:当前数位从0开始到cur,当前数位每增大1,当前数位左边的每个数均出现value次,所以总共会出现value * (cur + 1)次。(如12340这个数,cur = 4,value = 10。从12300增大到12349时,cur左边的1、2、3这三个数均会出现 value * (cur + 1) = 50次) 4、如果当前数位左边还有数,当前数位左移,继续统计。 AC代码:
#include <iostream>
#include <cstring> using namespace std;
typedef long long ll; void dfs(ll res , ll value , ll LLSum[])
{
ll cur = res % ;
res /= ;
ll t = res;
for (int i = ; i <= cur ; i++) LLSum[i] += value;
for (int i = ; i < ; i++) LLSum[i] += res * value;
while (t) {
LLSum[t%] += (cur + ) * value;
t /= ;
}
if (res) dfs(res-,value * ,LLSum);
return;
} int main()
{
ll a,b;
ll Suma[],Sumb[];
memset(Suma,,sizeof(Suma));
memset(Sumb,,sizeof(Sumb));
cin >> a >> b;
dfs(a-,,Suma);
dfs(b,,Sumb);
for (int i = ; i < ; i++) {
cout << Sumb[i] - Suma[i] << endl;
}
return ;
}
其实只要撸清各位数字之间的影响就可以了。
51nod- 【1042 数字0-9的数量 】的更多相关文章
- 51nod 1042数字0-9的数量
		1042 数字0-9的数量 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 收藏 关注 给出一段区间a-b,统计这个区间内0-9出现的次数. 比如 10-19 ... 
- 51nod 1042 数字0-9的数量 数位dp
		1042 数字0-9的数量 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 收藏 关注 给出一段区间a-b,统计这个区间内0-9出现的次数. 比如 10-1 ... 
- 51nod 1042 数字0-9的数量
		给出一段区间a-b,统计这个区间内0-9出现的次数. 比如 10-19,1出现11次(10,11,12,13,14,15,16,17,18,19,其中11包括2个1),其余数字各出现1次. Inp ... 
- (数位DP)51NOD 1042 数字0-9的数量
		给出一段区间a-b,统计这个区间内0-9出现的次数. 比如 10-19,1出现11次(10,11,12,13,14,15,16,17,18,19,其中11包括2个1),其余数字各出现1次. 输入 ... 
- 1042 数字0-9的数量    1050 循环数组最大子段和    1062 序列中最大的数    1067 Bash游戏 V2    1092 回文字符串
		1042 数字0-9的数量 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 给出一段区间a-b,统计这个区间内0-9出现的次数. 比如 10-19,1出现11次 ... 
- 51 Nod1042 数字0到9的数量
		1042 数字0-9的数量 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 收藏 关注 给出一段区间a-b,统计这个区间内0-9出现的次数. 比如 10-19 ... 
- 51nod 1042 数位dp
		http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1042 1042 数字0-9的数量 基准时间限制:1 秒 空间限制:131 ... 
- 字符串怎么换行 || 字符串中使用单引号时应该怎么写 || 保留两位小数 || 数字0在if中的意思是false || 什么情况下会会报undefined || null和undefined的区别 ||
		换行的字符串 "This string\nhas two lines" 字符串中使用单引号时应该怎么写 'You\'re right, it can\'t be a quote' ... 
- 【编程题目】n 个数字(0,1,…,n-1)形成一个圆圈,从数字 0 开始
		第 18 题(数组):题目:n 个数字(0,1,…,n-1)形成一个圆圈,从数字 0 开始,每次从这个圆圈中删除第 m 个数字(第一个为当前数字本身,第二个为当前数字的下一个数字).当一个数字删除后, ... 
随机推荐
- e2e 测试(1)
			距离上一随笔,已经有一个月没有没写.到今天,刚刚好好,是学习e2e测试的一个月.今天有点时间可以总结一下这个月来的收获. 1.搭建e2e的测试环境 我是使用 Vue 构建项目,所以我也是通过Vue-c ... 
- 方便好用的 Idea mybatis 插件 MyBatisCodeHelper
			优点: 1.mapper文件(即表对应的dao)与xml文件自由切换,方便代码评审: 2.自动代码生成功能提高开发效率,mysql数据库创建好表结构,写完 pojo(注意字段类型要统一用对象类型!), ... 
- php ajax bootstrap多文件上传图片预览,ajax上传文件
			<form enctype="multipart/form-data" id="upForm"> <label class="btn ... 
- win10与centos7的双系统U盘安装(三:win10启动项的恢复)
			启动项的恢复比起前面两篇就简单多了,就是一个修改启动项的引导文件即可. 首先登陆超级管理员账户,也就是账号为root,密码为你在篇2设置的密码,注意linux系统下输入的密码不可见,小白容易误以为是b ... 
- leetCode 典型回溯例子
			39题,翻译题目:给定一组候选集和一个目标值,在c的所有组合中,找出所有总和等于T的组合. 候选数组c中同一个数可以被选择多次(不限次数) 分析: 典型的回溯法应用 对数组里面的每个数,用递归的方式相 ... 
- images
- xshell提示必须安装最新的更新
			今天大家的xshell基本都出了这个问题 调整时间,调整到比较前的时间,打开xshell即可. 然后工具->选项 把更新去了 
- AttributeError: 'cx_Oracle.Cursor' object has no attribute 'numbersAsStrings'
			转载自:https://www.wengbi.com/thread_77579_1.html 最近在本地搭建Django开发环境,Django 1.11,python 2.7.11,数据库Oracle ... 
- Python select 详解(转)
			I/O多路复用是在单线程模式下实现多线程的效果,实现一个多I/O并发的效果.看一个简单socket例子: import socket SOCKET_FAMILY = socket.AF_INET SO ... 
- 3.7 C++派生类构造函数调用规则
			参考:http://www.weixueyuan.net/view/6364.html 总结: 派生类构造函数可以自动调用基类的默认构造函数而无需显式调用. 生类构造函数可以自动调用基类的默认构造函数 ... 
