(计数器)NOIP模拟赛(神奇的数位DP题。。)
没有原题传送门。。
手打原题QAQ
【问题描述】
一本书的页数为N,页码从1开始编起,请你求出全部页码中,用了多少个0,1,2,…,9。其中—个页码不含多余的0,如N=1234时第5页不是0005,只是5。
【输入】
一个正整数N(N≤109),表示总的页码。
【输出】
共十行:第k行为数字k-1的个数。
这道题是一道很有意思的DP题。
我们先来看一看这道题目
就是求1~n这么多个数中有多少个X数字。
然后我们来看一看一个例子:
在1~10这10个数中,每个数字(0~9)都在个位数中出现了1次。
在1~100这100个数中,每个数字(0~9)都在十位数中出现了10次。
在1~1000这1000个数中,每个数字(0~9)都在百位数中出现了100次。
以此类推。
所以我们得出了规律
在1~10^n中,数字x在第n-1位中出现了10^n-1次
如求2516数字5出现的次数
首先在2511~2516中,数字5在个位数出现1次;
在1~2510中,数字5在个位数中出现251次
251+1=252;
在1~2500中,数字5在十位数中出现25*10=250次
在1~2000中,数字5在百位数出现了2*100=200次
但是没完!
在2500~2516这么多数中,数字5在百位数还出现了16+1=17次
因为千位数字为2,小于5,所以5不会出现在千位
所以数字5出现的总次数就是252+250+200+17=719次
所以对于任何一个数字X,计算法则如下
计算X在右数第i位出现的次数
则为:
a=X*10^(i-1);
若num[i]>X return a+10^(i-1)即开头全部都为X数字的
若num[i]<X return a;
若num[i]==x return a+num%(10^i)+1;
但是对于任何一个数,0不可能为首位。
所以在计算0只能计算到第n-1位(假设num的位数为n)
然后判断一下就可以搞出来啦!
#include<iostream>
#include<cstdio>
using namespace std;
int qs,n,l;
long long num[];
long long tt[];
long long ans[];
int main(){
freopen("count.in","r",stdin);
freopen("count.out","w",stdout);
scanf("%d",&n);
qs=n;
while(qs){
l++;
num[l]=qs%;
qs/=;
}
tt[]=;
for(int i=;i<=;i++)
tt[i]=tt[i-]*;
qs=n;
for(int i=l;i>=;i--)
{
for(int j=;j<=;j++)
ans[j]+=tt[i-]*num[i]*(i-);
for(int j=;j<num[i];j++)
ans[j]+=tt[i];
ans[num[i]]+=qs%tt[i]+;
}
for(int i=;i<=l;i++)
ans[]-=tt[i];
for(int i=;i<=;i++)
printf("%lld\n",ans[i]);
fclose(stdin);
fclose(stdout);
return ;
}
(计数器)NOIP模拟赛(神奇的数位DP题。。)的更多相关文章
- 2018.08.19 NOIP模拟 number(类数位dp)
Number 题目背景 SOURCE:NOIP2015-SHY-10 题目描述 如果一个数能够表示成两两不同的 3 的幂次的和,就说这个数是好的. 比如 13 是好的,因为 13 = 9 + 3 + ...
- 【NOIP模拟赛】超级树 DP
这个题我在考试的时候把所有的转移都想全了就是新加一个点时有I.不作为II.自己呆着III.连一个IV.连接两个子树中的两个V连接一个子树中的两个,然而V我并不会转移........ 这个题的正解体现了 ...
- 2018.11.07 NOIP模拟 异或(数位dp)
传送门 对于每个二进制位单独考虑贡献. 然后对于两种情况分别统计. 对于第二种要用类似数位dpdpdp的方法来计算贡献. 代码
- 2019.6.1 模拟赛——[ 费用流 ][ 数位DP ][ 计算几何 ]
第一题:http://codeforces.com/contest/1061/problem/E 把点集分成不相交的,然后跑费用流即可.然而错了一个点. #include<cstdio> ...
- [noip模拟赛]某种数列问题<dp>
某种数列问题 (jx.cpp/c/pas) 1000MS 256MB 众所周知,chenzeyu97有无数的妹子(阿掉!>_<),而且他还有很多恶趣味的问题,继上次纠结于一排妹子的排法以 ...
- NOIp模拟赛 巨神兵(状压DP 容斥)
\(Description\) 给定\(n\)个点\(m\)条边的有向图,求有多少个边集的子集,构成的图没有环. \(n\leq17\). \(Solution\) 问题也等价于,用不同的边集构造DA ...
- 模拟赛毒瘤状压DP题:Kronican
Kronican 内存限制:32 MiB 时间限制:2000 ms 标准输入输出 题目类型:传统 评测方式:文本比较 上传者: cqbzgm 题目描述 Mislav有N个无限体积的杯子,每一个杯子中都 ...
- Nescafe #29 NOIP模拟赛
Nescafe #29 NOIP模拟赛 不知道这种题发出来算不算侵权...毕竟有的题在$bz$上是权限题,但是在$vijos$似乎又有原题...如果这算是侵权的话请联系我,我会尽快删除,谢谢~ 今天开 ...
- contesthunter暑假NOIP模拟赛第一场题解
contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...
随机推荐
- selenium库:自动化测试工具
爬虫中主要用来解决Javascript渲染问题 1.声明浏览器对象: from selenium import webdriver browser = webdriver.浏览器名() 2.访问页面: ...
- Python学习之高级特性
切片 在Python基础篇里,我们知道Python的可序列对象可以通过索引号(下标)来引用对象元素,索引号可以由0开始从左向右依次获取,可以从-1开始由右向左获取.这种方法可以帮助我们依次获取我们想要 ...
- 笔记-python-lib-lxml
笔记-python-lib-lxml 1. lxml简介 lxml是一个实现解析网页文件的库,python中自带有解析库,但没有lxml方便好用. The lxml XML toolkit ...
- Android 热点相关操作
Android未提供对该API的直接访问, 需要使用反射, 代码较简单, 如下 GetHotspotState.java package club.seliote.hotspotscanner.uti ...
- Spark 源码阅读——任务提交过程
当我们在使用spark编写mr作业是,最后都要涉及到调用reduce,foreach或者是count这类action来触发作业的提交,所以,当我们查看这些方法的源码时,发现底层都调用了SparkCon ...
- 邮件系统之Postfix与Dovecot
电子邮件系统 电子邮件系统基于邮件协议来完成电子邮件的传输,常见的邮件协议有: 简单邮件传输协议(Simple Mail Transfer Protocol,SMTP):用于发送和中转发出的电子邮件, ...
- c语言printf()输出格式大全(转载)
1.转换说明符 %a(%A) 浮点数.十六进制数字和p-(P-)记数法(C99) %c 字符 %d 有符号十进制整 ...
- MySQL之查询性能优化(一)
为什么查询速度会慢 通常来说,查询的生命周期大致可以按照顺序来看:从客户端,到服务器,然后在服务器上进行解析,生成执行计划,执行,并返回结果给客户端.其中“执行”可以认为是整个生命周期中最重要的阶段, ...
- Trident学习笔记(二)
aggregator ------------------ 聚合动作:聚合操作可以是基于batch.stream.partiton [聚合方式-分区聚合] partitionAggregate 分区聚 ...
- python学习笔记十二:类的定义
demo #!/usr/bin/python class Person: name = 'jim' age = 25 def say(self): print 'My name is ' + self ...