UVA - 1640 The Counting Problem (数位dp)
题意:统计l-r中每种数字出现的次数
很明显的数位dp问题,虽然有更简洁的做法但某人已经习惯了数位dp的风格所以还是选择扬长避短吧(说白了就是菜啊)
从高位向低位走,设状态$(u,lim,ze)$表示当前走到了第几位,是否有上限,是否有前导零的状态,则问题转化成了求所有转移路径中经过的所有数字的数量统计问题。
设$f[u][lim][ze]$为从状态$(u,lim,ze)$向后走能到达的状态总数,$g[u][lim][ze][i]$为状态$(u,lim,ze)$及其向后走能到达的所有状态中数字$i$出现的总数,各种转移就行了,实现细节比较复杂就不啰嗦了~~
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=+,inf=0x3f3f3f3f;
int l,r,bit[N],nb,f[N][][],g[N][][][],vis[N][][],cnt[N],ka;
void dfs(int u,int lim,int ze) {
if(vis[u][lim][ze]==ka)return;
vis[u][lim][ze]=ka;
if(u==) {
f[u][lim][ze]=;
for(int i=; i<=; ++i)g[u][lim][ze][i]=;
return;
}
f[u][lim][ze]=;
for(int i=; i<=; ++i)g[u][lim][ze][i]=;
for(int i=; i<=(lim?bit[u]:); ++i) {
int lim2=(lim&&i==bit[u]),ze2=(ze&&i==);
dfs(u-,lim2,ze2);
f[u][lim][ze]+=f[u-][lim2][ze2];
if(!(ze&&i==))g[u][lim][ze][i]+=f[u-][lim2][ze2];
for(int j=; j<=; ++j)g[u][lim][ze][j]+=g[u-][lim2][ze2][j];
}
}
void solve(int x,int F) {
for(nb=; x; x/=)bit[++nb]=x%;
dfs(nb,,);
for(int i=; i<=; ++i)cnt[i]+=F*g[nb][][][i];
}
int main() {
while(scanf("%d%d",&l,&r)&&l) {
if(l>r)swap(l,r);
memset(cnt,,sizeof cnt);
++ka,solve(r,);
++ka,solve(l-,-);
for(int i=; i<=; ++i)printf("%d%c",cnt[i]," \n"[i==]);
}
return ;
}
UVA - 1640 The Counting Problem (数位dp)的更多相关文章
- UVA 1640 The Counting Problem UVA1640 求[a,b]或者[b,a]区间内0~9在里面各个数的数位上出现的总次数。
/** 题目:UVA 1640 The Counting Problem UVA1640 链接:https://vjudge.net/problem/UVA-1640 题意:求[a,b]或者[b,a] ...
- 『The Counting Problem 数位dp』
The Counting Problem Description 求 [L,R]内每个数码出现的次数. Input Format 若干行,一行两个正整数 L 和 R. 最后一行 L=R=0,表示输入结 ...
- UVA 1640 The Counting Problem
https://vjudge.net/problem/UVA-1640 题意:统计区间[l,r]中0——9的出现次数 数位DP 注意删除前导0 #include<cmath> #inclu ...
- UVA.1640.The Counting Problem / BZOJ.1833.[ZJOI2010]数字计数(数位DP)
题目链接 \(Description\) 求\([l,r]\)中\(0,1,\cdots,9\)每个数字出现的次数(十进制表示). \(Solution\) 对每位分别DP.注意考虑前导0: 在最后统 ...
- UVA 1640 The Counting Problem(按位dp)
题意:给你整数a.b,问你[a,b]间每个数字分解成单个数字后,0.1.2.3.4.5.6.7.8.9,分别有多少个 题解:首先找到[0,b]与[0,a-1]进行区间减法,接着就只是求[0,x] 对于 ...
- UVa 1640 - The Counting Problem(数论)
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- POJ2282:The Counting Problem(数位DP)
Description Given two integers a and b, we write the numbers between a and b, inclusive, in a list. ...
- UVa 1640 The Counting Problem (数学,区间计数)
题意:给定两个数m, n,求从 m 到 n 中0-9数字各出现了多少次. 析:看起来挺简单的,其实并不好做,因为有容易想乱了.主要思路应该是这样的,分区间计数,先从个位进行计,一步一步的计算过来.都从 ...
- hdu 5106 Bits Problem(数位dp)
题目链接:hdu 5106 Bits Problem 题目大意:给定n和r,要求算出[0,r)之间全部n-onebit数的和. 解题思路:数位dp,一个ct表示个数,dp表示和,然后就剩下普通的数位d ...
随机推荐
- Golang- import 导入包的几种方式:点,别名与下划线
包的导入语法 在写Go代码的时候经常用到import这个命令用来导入包文件,看到的方式参考如下: import( "fmt" ) 然后在代码里面可以通过如下的方式调用 fmt.Pr ...
- Django-ORM之ForeignKey的使用-多对一关系
ForeignKey使用俩表示两张表多对一关系的外键,外键字段要定义在多属性的表中. 定义外键时,to的表可以直接写类名,但是需要注意类的定义顺序:也可以写字符串式的类名,这样就可以忽略class类的 ...
- ubuntu 16.04 关闭开启图形界面
说明案例:ubuntu16.04 关闭图形界面命令: systemctl disable lightdm.service 开启图形界面命令: ln -s /lib/systemd/system/lig ...
- 测试工具/PostMan
1.postman测试上传文件
- 【linux杂谈】遇到REMOTE HOST IDENTIFICATION HAS CHANGED怎么办?
今日遇到如下问题: 警告的大概意思就是,主机密钥发生变更,并提示安全风险(可能存在中间人攻击) 但是事实是,这是因为我重装系统之后遇到的问题.重装系统后,指纹当然会发生变化了...在Xshell实验中 ...
- FTL2
ABSTACT 1.NAND flash memory (主要缺点): (1)partial page updates (2)general-purpose cache usually does n ...
- PHP 调用shell命令
可以使用的命令: popenfpassthrushell_execexecsystem 1.popen resource popen ( string command, string mode ) 打 ...
- Shell初学(七)linux账户管理/群组管理
[1]新建用户 用户相关文件:/etc/passwd /etc/shadow useradd useradd的默认预设 [2]设置密码 passwd 常见修改密码使用技巧: echo "1 ...
- ASP.NET Core中使用EF Core(MySql)Database First
⒈创建数据库,在数据中执行以下脚本. CREATE DATABASE Blogging; USE Blogging; CREATE TABLE Blog ( BlogId int not null P ...
- 爬取糗事百科热门段子的数据并保存到本地,xpath的使用
和之前的爬虫类博客的爬取思路基本一致: 构造url_list,因为糗事百科的热门栏目默认是13页,所以这个就简单了 遍历发送请求获取响应 提取数据,这里用的是xpath提取,用的是Python的第三方 ...