51nod 1042 数位dp
http://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
经典的数位dp题目,但是这个'0'真是搞得我恶心,第一次见是在玲珑某次比赛,那次一直怼这个最后爆零- -
dp[i]表示[0,10
i
-1]之间所有的数里面0-9出现的次数,有dp[i]=10*dp[i-1]+pow(10,i-1),显然1-9的次数的一样的,0得话,
因为没有以零开头的多位数,所以这里面是多计算了一部分'0'的,计算时遇到0就要想办法减去他才行。
假如[0,999],多计算的就是100+10+1个零,对应的是001,002.....099,100是最高位,10是次高位,依次递推。
假如要计算f(2049,0),第一次 s+=dp[3]*2;
这两个dp[3]一个是加的 [0,999]一个是[1000,1999],但是我们只去掉一次就好了因为在[1000,1999]间那些零反而是我们需要的,就是这一点我糊涂好久。
#include<cstring>
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
#define inf 0x3f3f3f3f
#define LL long long
LL dp[], zero[] = { ,, };
LL qpow(LL a,LL b,LL r=){for(;b;b>>=,a=a*a)if(b&)r=r*a;return r;}
void init()
{
dp[]=;
for(LL i=;i<;++i)
dp[i]=*dp[i-]+qpow(,i-);
}
LL f(LL N,LL digit)
{
if(N==) {return digit?:;}
int len=log(N+0.05)/log()+;
LL s=,nx=N;
for(int i=len;i>=;--i)
{
LL mul=qpow(,i-);
s+=dp[i-]*(N/mul);
{
if(N/mul->=digit) s+=qpow(,i-);
if(N/mul==digit) s+=N%mul+;
}
N%=mul;
//if(!digit) cout << "s=" << s << endl;
}
if (!digit) // 删除前缀是0的结果
{
LL m = ;
while (nx)
{
s -= m;
m *= ;
nx = nx / ;
}
}
//if (!digit) cout <<"s="<< s << endl;
return s;
}
int main()
{
init();
LL a,b,x;
cin >> a >> b;
for(x=;x<=;++x)
{
cout<<f(b,x)-f(a-,x)<<endl;
}
return ;
}
这是从新学习后自己写的代码
#include<bits/stdc++.h>
using namespace std;
#define LL long long
LL f[]={,};
LL p10[]={,};
LL zero[]={,};
LL bit[];
void init(){
for(int i=;i<=;++i) p10[i]=p10[i-]*;
for(int i=;i<=;++i) zero[i]=zero[i-]*+;
for(int i=;i<=;++i) f[i]=f[i-]*+p10[i-];
}
LL cal(LL N,int x){
int len=;
while(N){
bit[len++]=N%;
N/=;
}
bit[len]=-;
LL ans=,tot=;
for(int i=len-;i>=;--i){
ans+=f[i]*bit[i];
if(!x && i==len-) ans-=(LL)(zero[i]);
if(bit[i]>x && ((x==&&i==len-)==) ) ans+=p10[i];
ans+=p10[i]*bit[i]*tot;
if(bit[i]==x) tot++;
}
return ans;
}
int main(){
LL l,r,n,i,j,k;
init();
while(scanf("%lld%lld",&l,&r)==){
for(i=;i<;++i)
printf("%lld\n",cal(r+,i)-cal(l,i));
}
return ;
}
51nod 1042 数位dp的更多相关文章
- 51nod 1009 数位dp入门
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1009 1009 数字1的数量 基准时间限制:1 秒 空间限制:13107 ...
- 51 Nod 1042 数位dp
1042 数字0-9的数量 1 秒 131,072 KB 10 分 2 级题 给出一段区间a-b,统计这个区间内0-9出现的次数. 比如 10-19,1出现11次(10,11,12,13,14,1 ...
- 51nod 1043 数位dp
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1043 1043 幸运号码 基准时间限制:1 秒 空间限制:131072 ...
- 51nod 1009 - 数字1的数量 - [数位DP][模板的应用以及解释]
题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1009 基准时间限制:1 秒 空间限制:131072 KB 给 ...
- 51NOD 1623 完美消除 数位DP
题目描述: 定义数的消除操作为选定[L,R,x],如果数的第L到第R位上的数字都大于等于x,并且这些数都相等,那么该操作是合法的(从低位到高位编号,个位是第一位,百位是第二位……),然后将这些位数上的 ...
- 51nod 1009 数字1的数量(数位dp模板)
给定一个十进制正整数N,写下从1开始,到N的所有正数,计算出其中出现所有1的个数. 例如:n = 12,包含了5个1.1,10,12共包含3个1,11包含2个1,总共5个1. 数位dp的模板题 ...
- 51Nod 1009 数字1的个数 | 数位DP
题意: 小于等于n的所有数中1的出现次数 分析: 数位DP 预处理dp[i][j]存 从1~以j开头的i位数中有几个1,那么转移方程为: if(j == 1) dp[i][j] = dp[i-1][9 ...
- 51nod1043(数位dp)
题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1043 题意:中文题诶- 思路:数位dp 我们用dp[i][j ...
- 1043 幸运号码 数位DP
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1043 设dp[i][j]表示前i位数中,i位数的和为j时的所有情况. 转 ...
随机推荐
- 去除MyEclipse 中新建servlet多余的注释问题
1.找到你的MyEclipse 的安装目录 2.点击文件位置,找到安装目录下的Common 文件夹下的plugins 3.找到com.genuitec.eclipse.wizards.jar 文件, ...
- 全球第一张中文网络协议分析图——By 成都科来软件
网上内容比较全面的网络协议图并不是很多,这些网络协议图大多只遵循OSI,对于TCP/IP基本不支持,有些协议图表示也不够准确.另一方面,现在网上能找到的协议图全都是英文版本,使用起来不是很方便.国内的 ...
- Linux学习笔记—Linux磁盘与文件系统管理(转载)
认识EXT2文件系统 文件的系统特性 Linux的正规文件系统为Ext2 文件数据除了文件实际内容外,还包括其他属性(文件权限.文件属性). 文件系统将这两部分数据分别存放在不同的块,权限和属性放在i ...
- redis实现cache系统原理(五)
1. 介绍 cache就是人们所说的缓存.我们这里所说的cache是web上的.对用户来说,衡量一个网站是否具有良好的体验,其中一个标准就是响应速度的快慢.可能网站刚上线,功能还较少,数据库的记录也不 ...
- java.net.SocketException四大异常解决方案(转)
java.net.SocketException如何才能更好的使用呢?这个就需要我们先要了解有关这个语言的相关问题.希望大家有所帮助.那么我们就来看看有关java.net.SocketExceptio ...
- MySQL 单表查询(Day42)
阅读目录 一,查询语法 二,简单查询 三,where约束 四,having过滤 五,分组查询 group by 六,关键字的执行优先级 七,查询排列 order by 八,使用聚合函数查询 九,whe ...
- Educational Codeforces Round 11A. Co-prime Array 数学
地址:http://codeforces.com/contest/660/problem/A 题目: A. Co-prime Array time limit per test 1 second me ...
- POJ - 2763 Housewife Wind (树链剖分/ LCA+RMQ+树状数组)
题意:有一棵树,每条边给定初始权值.一个人从s点出发.支持两种操作:修改一条边的权值:求从当前位置到点u的最短路径. 分析:就是在边可以修改的情况下求树上最短路.如果不带修改的话,用RMQ预处理LCA ...
- Linux信号signal处理机制
信号机制是进程之间相互传递消息的一种方法,信号全称为软中断信号,也有人称作软中断.从它的命名可以看出,它的实质和使用很象中断.所以,信号可以说是进程控制的一部分. 一.信号的基本概念 ...
- kali安装后配置
0x00.安装Vmware Tools 由于是在VMware Workstation里面安装的,所以需要首先安装VMware tools工具方便我们Ctrl+C和Ctrl+V,步骤如下: 在VMWar ...