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时的所有情况. 转 ...
随机推荐
- Pandas 通过追加方式合并多个csv
常用合并 通常用pandas进行数据拼接.合并的方法有: pandas.merge() pandas.concat() pandas.append() 还有一种方式就是通过 pd.to_csv() 中 ...
- 细数Python中的数据类型以及他们的方法
一.数据类型的种类及主要功能 1.数字类型 数字类型主要是用来计算,它分为整数类型int和浮点类型float 2.布尔类型 布尔类型主要是用于判断,它分为真True和False两种 3.字符串类型 字 ...
- Sql server用QQ邮箱发送邮件
一.配置数据库邮件 https://jingyan.baidu.com/article/3ea51489a135f752e71bba5b.html
- Python(变量、数据类型)
常量:python中没有常量,只能通过名字特征来提示例如:全部大写,如 : OLDBOY_AGE=57 一.变量 变量声明变量#!/usr/bin/env python age=18gender1=' ...
- python代码结构
1. 使用#单行注释,使用'''...'''多行注释 2. 使用连接符\来把一行过长的代码分为多行 3. 用缩进来控制代码块,推荐使用PEP8缩进风格,即四个空格 4. if ...: elif... ...
- shiro 拦截器
参考
- Eclipse 中安装Browse Deployment Location插件
Browse Deployment Location 功能的插件名称为: Pivotal tc Server Integration for Eclipse 可在Eclippse的Eclipse M ...
- Soap 教程
SOAP 构建模块 一条 SOAP 消息就是一个普通的 XML 文档,包含下列元素: · 必需的 Envelope 元素,可把此 XML 文档标识为一条 SOAP 消息 · 可选的 Header 元素 ...
- Oracle事务和锁机制
事务 1. 说明 一组SQL,一个逻辑工作单位,执行时整体修改或者整体回退. 2.事务相关概念 1)事务的提交和回滚:COMMIT/ROLLBACK 2)事务的开始和结束 开始事务:连接到数据库,执行 ...
- Ubuntu更新Hostname和hosts
一.概述 Hostname 即主机名,一般存放在 /etc/hostname 中.hosts 即本地域名解析文件,存放在 /etc/hosts 中. 二.测试 2.1 hostname 2.2 hos ...