zznu 1255 数字统计(数位DP, 数学方法)
最近在学数位DP, 感觉还是满有收获的! 做了几个题之后想起来自己OJ上曾经做的一道题,以前是用数学方法写的,现在改用数位DP来写了一遍。
题目:
1255: 数字统计
时间限制: 1 Sec 内存限制: 128 MB
提交: 31 解决: 4
[提交][状态]
题目描述
一本书的页码从自然数1 开始顺序编码直到自然数n。书的页码按照通常的习惯编排,
每个页码都不含多余的前导数字0。例如,第6 页用数字6 表示,而不是06 或006 等。数
字计数问题要求对给定书的总页码n,计算出书的全部页码中分别用到多少次数字0,1,
2,…,9。
输入
给出表示书的总页码的整数n(1≤n≤2^31-1)
输出
输出10行,在第k行输出页码中用到数字k-1 的次数,k=1,2,…,10。
样例输入
11
样例输出
1
4
1
1
1
1
1
1
1
1
链接:http://acm.zznu.edu.cn/problem.php?id=1255
数学方法:
其实就是假设每一位是0-9然后进行判断, 计算出结果
#include<stdio.h>
int Slove(int num,int k)
{
int L, R, M, P = , a = num;
int sum = ;
while(a)
{
R = num%P;
M = a%;
L = a/;
if(k)
{
if(k < M)
sum += (L+)*P;
else if(k == M)
sum += L*P + (R+);
else
sum += L*P;
}
else
{
if(a<)
break;
if(k == M)
sum += (L-)*P + (R+);
else
sum += L*P;
}
P *= ;
a /= ; }
return sum;
} int main()
{
int n, ans;
int i;
scanf("%d",&n);
for(i=; i<=; i++)
{
ans = Slove(n,i);
printf("%d\n",ans);
}
return ;
}
数位DP;
这个就比较通用了, 就是套模版, 对数据的处理上 稍加注意, 然后把状态确定好。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL;
LL dp[][][][];//dp[位数][数字出现的次数][这个数字是多少][首位是否是0]
int bit[]; LL dfs(int pos,int cou,int num,int flag,bool is0)
{
if( pos == - )
{
return cou;
} if(!flag && dp[pos][cou][num][is0] != -)
return dp[pos][cou][num][is0]; LL ans = ;
int end = flag? bit[pos]: ; for(int i=; i<=end; i++)
{
if(i == num && !(is0 && i == ) )
ans += dfs(pos-, cou+, num, flag && i == end, is0 && i == );
else
ans += dfs(pos-, cou, num, flag && i == end, is0 && i == );
} if(!flag)
dp[pos][cou][num][is0] = ans; return ans;
} void solve(LL n)
{
int len = , i, m = n;
LL ans;
while(n)
{
bit[len++] = n%;
n /= ;
} for(i=; i<=; i++)
{
ans = dfs(len-, , i, , );
printf("%lld\n", ans);
}
// printf("\n\n\n");
} int main()
{
LL a;
memset(dp, - ,sizeof(dp)); while(scanf("%lld", &a) != EOF)
{
solve(a);
}
// printf("\n\n\n");
return ;
}
zznu 1255 数字统计(数位DP, 数学方法)的更多相关文章
- 【BZOJ-1833】count数字计数 数位DP
1833: [ZJOI2010]count 数字计数 Time Limit: 3 Sec Memory Limit: 64 MBSubmit: 2494 Solved: 1101[Submit][ ...
- BZOJ 1833 数字计数 数位DP
题目链接 做的第一道数位DP题,听说是最基础的模板题,但还是花了好长时间才写出来..... 想深入了解下数位DP的请点这里 先设dp数组dp[i][j][k]表示数位是i,以j开头的数k出现的次数 有 ...
- 1833: [ZJOI2010]count 数字计数——数位dp
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1833 省选之前来切一道裸的数位dp.. 题意 统计[a,b]中0~9每个数字出现的次数(不算 ...
- [bzoj1833][ZJOI2010]count 数字计数——数位dp
题目: (传送门)[http://www.lydsy.com/JudgeOnline/problem.php?id=1833] 题解: 第一次接触数位dp,真的是恶心. 首先翻阅了很多很多一维dp,因 ...
- Luogu P2602 [ZJOI2010]数字计数 数位DP
很久以前就...但是一直咕咕咕 思路:数位$DP$ 提交:1次 题解:见代码 #include<cstdio> #include<iostream> #include<c ...
- 2018.07.26NOIP模拟 魔法数字(数位dp)
魔法数字 题目背景 ASDFZ-NOIP2016模拟 题目描述 在数论领域中,人们研究的基础莫过于数字的整除关系.一般情况下,我们说整除总在两个数字间进行,例如 a | b(a能整除b)表示 b 除以 ...
- bzoj1833: [ZJOI2010]count 数字计数(数位DP+记忆化搜索)
1833: [ZJOI2010]count 数字计数 题目:传送门 题解: 今天是躲不开各种恶心DP了??? %爆靖大佬啊!!! 据说是数位DP裸题...emmm学吧学吧 感觉记忆化搜索特别强: 定义 ...
- CodeForces 55D Beautiful numbers(数位dp+数学)
题目链接:http://codeforces.com/problemset/problem/55/D 题意:一个美丽数就是可以被它的每一位的数字整除的数. 给定一个区间,求美丽数的个数. 显然这是一道 ...
- 【题解】P2602 数字计数 - 数位dp
P2602 [ZJOI2010]数字计数 题目描述 给定两个正整数 \(a\) 和 \(b\) ,求在 \([a,b]\) 中的所有整数中,每个数码(digit)各出现了多少次. 输入格式 输入文件中 ...
随机推荐
- Bulk Insert 高效快速插入数据
BULK INSERT以用户指定的格式复制一个数据文件至数据库表或视图中. 语法: BULK INSERT [ [ 'database_name'.][ 'owner' ].]{ 'table_nam ...
- u盘安装linux(windows7+linux双系统)
前提条件:1.先装windows7,后装linux系统 2.windows7 里有“未分区的空间”(不是C:,D:,E:) :计算机→管理→存储空间,删除一些压缩卷即可. 3.下载ultraiso → ...
- YYCache 源码分析(二)
本文分析YYMemoryCache实现原理: YYMemoryCache是内存缓存,所以存取速度非常快,主要用到两种数据结构的LRU淘汰算法 1.LRU Cache的容量是有限的,当Cache的空间都 ...
- Android(java)学习笔记244:多媒体之SurfaceView
1. SurfaceView: 完成单位时间内界面的快速切换(游戏界面流畅感). 我们之前知道一般的View,只能在主线程里面显示,主线程中更新UI.但是SurfaceView可以在子线程中里 ...
- 图片预览(base64和blob:图片链接)和ajax上传、下载(带进度提示)
直接上代码 html和js <!DOCTYPE html> <html> <head> <meta name="viewport" con ...
- php模拟HTTP协议发送post请求方法
今天用到php模拟http发送post请求记录 代码如下: <?php $url = 'xxxx.com'; $data = 'a=one&b=two'; $data = urlenco ...
- codeforces 251A Points on Line(二分or单调队列)
Description Little Petya likes points a lot. Recently his mom has presented him n points lying on th ...
- 使用MWC四轴起飞侧翻解决方法
原因如下:1.电机顺序错了,如上图所示,上面蓝色的箭头是机头,绿色的箭头是电机转向,3.10.11.9对应MWC飞控版上的D3,D9,D11,D9,蓝色箭头对应MWC飞控板的箭头 或者传感器的Y轴 以 ...
- 读书笔记 |Google C++编程风格指南
Google C++编程风格指南 ## 0. 背景 每一个C++程序员都知道,C++具有很多强大的语言特性,但这种强大不可避免的导致它的复杂,这种复杂会使得代码更易于出现bug.难于阅读和维护. 本指 ...
- js 实现分割条
js 实现 切分条效果, 为了熟悉js 写法,纯javascript 脚本编写 简单介绍几个函数: setCapture()函数的作用就是将后续的mouse事件都发送给这个对象, releaseCa ...