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)各出现了多少次. 输入格式 输入文件中 ...
随机推荐
- android 窗体透明的,黑暗度等的设置技巧
设置透明度(这是窗体本身的透明度,非背景) 1 WindowManager.LayoutParams lp=getWindow().getAttributes(); 2 lp.alpha=0.3f; ...
- 再回首,Java温故知新(六):Java基础之变量
变量在所有的编程语言中都有,属于最最基础的部分,学习这部分基本不分语言,变量可分为成员变量和局部变量 Java中变量的声明格式如下,修饰符如果不加,默认是default,关于修饰符,我们会在后续讲到, ...
- 化繁为简,无需后端。巧用Yql+rss,搭建我的个人网站
[本文含有大量的心理描写,没耐心的看官直接跳转到末尾即可] 前言: 最近做好了个人网站.很多人都喜欢用WordPress弄一个自己的博客之类的,但其实我觉得没这个必要,Lofter的功能.界面神马的于 ...
- Linux shell入门基础(四)
四.进程优先级前台后台 01.进程控制 #find /name aaa & #ps aux | grep find #updatedb & #ps aux | grep update ...
- JS遍历对象或者数组
一.纯js实现 <script> var obj = {"player_id":"GS001","event_id":" ...
- Google2016开发者大会
Android主讲: 一.吴晶:android笔记博主(博客:http://www.race604.com/) 主题:Android低功耗蓝牙(BLE)实践 低功耗蓝牙在可穿戴和智能家居里边用的比较多 ...
- 探究Activity的各回调方法
刚毕业那会儿,一心想朝着java web的方向进军,却岂料实习的时候阴差阳错地踏入了Android的大门,自此人生跌宕起伏.坎坎坷坷,在一家外企参与了几个需要越过GFW才能使用的有关于体育赛事的项目, ...
- 使用第三方框架 Masonry 实现自动布局
使用第三方框架 Masonry 实现自动布局 时间:2015-02-10 11:08:41 阅读:4595 评论:0 收藏:0 [点我收藏+] 标签: 由于前两 ...
- Linux文件编程实例
//捕获fopen调用中的错误 #include <stdio.h> #include <errno.h> #include <string.h> #define ...
- 【BZOJ1901】Dynamic Rankings
Description 给定一个含有n个数的序列a[1],a[2],a[3]……a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+2]……a[j]中第k小的数是 ...