【数位DP】数字统计】的更多相关文章

(https://www.pixiv.net/member_illust.php?mode=medium&illust_id=65608478) Problem Description For a decimal number x with n digits (AnAn-1An-2 ... A2A1), we define its weight as F(x) = An * 2n-1 + An-1 * 2n-2 + ... + A2 * 2 + A1 * 1. Now you are given…
最近在学数位DP, 感觉还是满有收获的! 做了几个题之后想起来自己OJ上曾经做的一道题,以前是用数学方法写的,现在改用数位DP来写了一遍. 题目: 1255: 数字统计 时间限制: 1 Sec  内存限制: 128 MB提交: 31  解决: 4[提交][状态] 题目描述 一本书的页码从自然数1 开始顺序编码直到自然数n.书的页码按照通常的习惯编排, 每个页码都不含多余的前导数字0.例如,第6 页用数字6 表示,而不是06 或006 等.数 字计数问题要求对给定书的总页码n,计算出书的全部页码中…
题目 给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次. 数位DP (1)分情况,逐位讨论. (2)模型:计算在[L,R]中有多少个数满足条件. (3)套路:将问题转化为[1,R]-[1,L-1],只需回答[1,X]的询问即可. 思路 1.算出[1,X]: (1)按位拆分,为后面做铺垫 (2)预处理: 1)pow[]表示10的次幂 2)f[]表示:后i位自由的话每个数字出现的次数 ps:有一个规律.0~9每个数字出现1次,10~99出现20次,100~99…
ZJOI2010 数字统计 上题题意为求[l,r]区间中每个数字(0~9)出现的次数 一般的做法为将区间当成[0,r]-[0,l-1],然后进行数位DP 但事实上将区间当成[0,r]-[0,l-1]后可以有另一种方法求出[0,x]中k出现的次数 具体做法: 我们对于每一位,求出k在这一位的数中有多少小于等于x,累加即可.(注意0不能前导,要分开处理) #define ll long long inline ll query(ll x,int k){//询问[0,x]的数字中k出现的次数 ); l…
1833: [ZJOI2010]count 数字计数 Time Limit: 3 Sec  Memory Limit: 64 MBSubmit: 2494  Solved: 1101[Submit][Status][Discuss] Description 给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次. Input 输入文件中仅包含一行两个整数a.b,含义如上所述. Output 输出文件中包含一行10个整数,分别表示0-9在[a,b]中出现了多少次.…
有一类与数位有关的区间统计问题.这类问题往往具有比较浓厚的数学味道,无法暴力求解,需要在数位上进行递推等操作.这类问题往往需要一些预处理,这就用到了数位DP. 本文地址:http://www.cnblogs.com/archimedes/p/numerical-digit-dp.html,转载请注明源地址. 基础知识 [l,r] 意为 l<=且<=r的数 [l,r) 意为 l<=且< r的数 (l,r] 意为 l<且<=r的数 (l,r) 意为 l<且< r…
今天去牛客网看了看 包含一 这道题,一开始没看清,以为它要统计 1~n 所有数中数字 '1' 出现的总次数,也就是说,若 n == 11,则 ans = 4:而按照题目的原意 ans 应该为 3.看错题意后还是挣扎了好久,具体的调试过程也不想回忆叙述了,先贴上按照我一开始理解的意思的代码吧,虽然没有题目让我测,但我和自己写的暴力法对拍过,应该没问题的. #include<cstdio> #include<cstring> #include<vector> #includ…
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1833 统计\(a~b\)中数字\(0,1,2,...,9\)分别出现了多少次. 分析 数位dp真是细节又多又容易出错,我都懒得看题解,所以也就懒得写题解了... 注意细节吧还是... #include <bits/stdc++.h> using namespace std; typedef long long ll; ll a,b; ll A[],B[],num[]; ll f[][][]…
题目链接 做的第一道数位DP题,听说是最基础的模板题,但还是花了好长时间才写出来..... 想深入了解下数位DP的请点这里 先设dp数组dp[i][j][k]表示数位是i,以j开头的数k出现的次数 有  数位dp的题一般都会用到前缀数组,题目要求我们求b-a这个区间里各个数码出现的次数,我们可以分别求出(0,b)和(0,a-1)然后相减即可 具体分析请看代码,写的还算详细 #include <bits/stdc++.h> using namespace std; typedef long lo…
题意: 小于等于n的所有数中1的出现次数 分析: 数位DP 预处理dp[i][j]存 从1~以j开头的i位数中有几个1,那么转移方程为: if(j == 1) dp[i][j] = dp[i-1][9]*2+pow(10,i-1);else dp[i][j] = dp[i-1][9]+dp[i][j-1]; 然后注意下对于每个询问统计的时候如果当前位为1需要额外加上他后面所有位数的个数,就是n%pow(10,i-1); 这样总复杂度log(n)*10 #include <bits/stdc++.…
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1833 省选之前来切一道裸的数位dp.. 题意 统计[a,b]中0~9每个数字出现的次数(不算前导零). 我的做法 首先把询问的[a,b]拆成[0,b]减去[0,a-1]的个数. 我们考虑算前导零的情况.此时可以逐位确定数字:如果某一位的数字<给定的数在那位的数字,那么显然后面的数字可以随便取,于是把所有后面随便取的10^k个数字之中的0~9的出现次数统计一下(这个稍微推一推就出来了嘛...…
题目: (传送门)[http://www.lydsy.com/JudgeOnline/problem.php?id=1833] 题解: 第一次接触数位dp,真的是恶心. 首先翻阅了很多很多一维dp,因为要处理前缀0,所以根本搞不懂. 查询了dalaolidaxin的博客,又查阅了资料: 初探数位dp 才完全弄懂这个题. 具体的,我们设 f[i][j][k]为考虑所有i位数,最高位为j数,之中k的数目. 我们可以得出方程: \[f[i][j][k] = \sum f[i-1][l][k] (j!=…
题目传送门 题目大意:给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次. 继续数位dp=w=. 这一次我们不需要记录$pre$啦!(撒花). 因为这次我们需要的是统计个数!那么我们就可以针对每个数字,搞一次记搜.记搜的时候只要注意传递下当前的数字个数就行了. 当然了我们还是需要关注下前导0的,如果现在还是前导0呢,那么肯定不能计数了... Code #include<cstdio> #include<algorithm> #include&l…
难受啊,怎么又遇到我不会的题了(捂脸) 如题,这是一道数位DP,随便找了个博客居然就是我们大YZ的……果然nb,然后就是改改模版++注释就好的了,直接看注释吧,就是用1~B - 1~A-1而已,枚举全部位然后判一下是不是上限边缘和前导零就OK #include<cstdio> #include<cstring> #include<algorithm> using namespace std; typedef long long LL; LL bit[]; ]; LL ]…
很久以前就...但是一直咕咕咕 思路:数位$DP$ 提交:1次 题解:见代码 #include<cstdio> #include<iostream> #include<cstring> #define ll long long #define R register ll using namespace std; ll f[][],a,b; //f[l][sum]对应dfs中(因为只在!ul&&!ck的时候记忆化) ]; ll dfs(int l,bool…
B吉利数字时限:1s [题目描述]算卦大湿biboyouyun最近得出一个神奇的结论,如果一个数字,它的各个数位相加能够被10整除,则称它为吉利数.现在叫你计算某个区间内有多少个吉利数字. [输入]第一行为样例个数N.接下来N行,每一行代表一个输入样例,每个输入样例有2个数,分别代表某个区间的起点a和终点b.注意所求区间为[a,b],1<=a<=b<=10^9 [输出]N行.对于第x个输入样例,在第x行输入该样例所对应的结果. [输入样例]21 101 20 [输出样例]01 [Hint…
题目链接:BZOJ - 1833 题目分析 数位DP .. 用 f[i][j][k] 表示第 i 位是 j 的 i 位数共有多少个数码 k . 然后差分询问...Get()中注意一下,如果固定了第 i 位,这一位是 t ,那么数码 t 的答案是要加一个值的(见代码). 代码 #include <iostream> #include <cstdlib> #include <cstdio> #include <cstring> #include <cmat…
BZOJ_1833_[ZJOI2010]count 数字计数_数位DP 题意: 给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次. 分析: 数位DP f[i][j][k]表示i位数,以j开头的数中k出现的次数 预处理出来10的幂(在数位DP中经常会用到) f[i][j][k]+=f[i-1][l][k]+(j==k)*10^(i-1) 之后按位枚举,0的情况特殊处理 代码: #include <stdio.h> #include <string.h…
1级算法题就这样了,前途渺茫啊... 更新一下博客,我刚刚想套用数位dp的模板,发现用那个模板也是可以做到,而且比第二种方法简单很多 第一种方法:我现在用dp[pos][now]来表示第pos位数字为now时数字1的数量,如果用数位dp的话,现在我们有三种情况 第一种情况:now!=1,那我没什么好说的了,继续向下搜吧. 第二种情况:now==1&&limit   :如果知道数位dp的套路的话,这个limit的意思相信是知道的,比如说一个数字1687,我们在程序走到pos==4,now==…
数位dp:处理数字数位关系的一种dp方式. 一般的题目特征十分明显: 1.一般和数字本身有很大关系. 2.一般求数字在区间L,R中的一些信息 3.L,R一般很大,通常能达到long long级别. dp方式也比较有套路: 一般有三种方法: 本质上的相似之处,都是集中在处理“填数有无限制”,“填数无限制情况下的固定方案数”,“某些已经搜出来的固定方案数” 1.记忆化搜索(没用过) 是一种倒着记忆的方法. 2.递推(我基本都是这个方法) 正着递推出答案. 一般会从高位向低位递推,讨论高位的填数方法,…
题意:求1-n的n个数字中1出现的个数. 解法:数位dp,dp[pre][now][equa] 记录着第pre位为now,equa表示前边是否有降数字(即后边可不能够任意取,true为没降,true为已降):常规的记忆化搜索 代码: /****************************************************** * author:xiefubao *******************************************************/ #p…
题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1009 基准时间限制:1 秒 空间限制:131072 KB 给定一个十进制正整数N,写下从1开始,到N的所有正数,计算出其中出现所有1的个数.   例如:n = 12,包含了5个1.1,10,12共包含3个1,11包含2个1,总共5个1. Input 输入N(1 <= N <= 10^9) Output 输出包含1的个数 Input示例 12 Output示…
正解:数位dp 解题报告: 传送门! 打算在寒假把学长发过题解的题目都做辣然后把不会的知识点都落实辣! ⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄ 然后这道题,开始想到的时候其实想到的是大模拟,就有点像之前考试贪心专题里的这题一样 但是仔细一看发现大模拟做得可能太复杂辣,,,讨论有点儿多,但是肯定是讨论得出来的辣想想看省选的时候大力讨论一波就有100pts岂不美哉! 但是反正今天是不会港模拟的解法dei,,,这里港的是数位dp的方法 首先很容易想到的是,数位dp套路来说,它既然是要求[l,r],那就显然是[…
传送门 数位dp板子题. f[i][mod]" role="presentation" style="position: relative;">f[i][mod]f[i][mod]表示当前进行到第i位,所有数位数字之和的余数是mod" role="presentation" style="position: relative;">modmod时的种类数,根据当前位选择是否有限制转移就行了. 代码…
魔法数字 题目背景 ASDFZ-NOIP2016模拟 题目描述 在数论领域中,人们研究的基础莫过于数字的整除关系.一般情况下,我们说整除总在两个数字间进行,例如 a | b(a能整除b)表示 b 除以 a 的余数为 0 . 我们称一个数字 X 是魔法的,当且仅当 X 是整数,且它能被 K 及 K 以上种一位数整除,要求这若干种一位数均在 X 的十进制表示中出现. 给出整数 K.L.R,请你计算出在区间 [L,R] 中,有多少个魔法数字. 输入格式 输入一行三个整数 K.L.R. 输出格式 输出一…
Description 给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次. Input 输入文件中仅包含一行两个整数a.b,含义如上所述. Output 输出文件中包含一行10个整数,分别表示0-9在[a,b]中出现了多少次. Sample Input 1 99 Sample Output 9 20 20 20 20 20 20 20 20 20 HINT 30%的数据中,a<=b<=10^6: 100%的数据中,a<=b<=10^12. 数…
P2602 [ZJOI2010]数字计数 题目描述 给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次. 输入输出格式 输入格式: 输入文件中仅包含一行两个整数a.b,含义如上所述. 输出格式: 输出文件中包含一行10个整数,分别表示0-9在[a,b]中出现了多少次. 输入输出样例 输入样例#1: 复制 1 99 输出样例#1: 复制 9 20 20 20 20 20 20 20 20 20 说明 30%的数据中,a<=b<=10^6: 100%的数据中,…
BZOJ1833 ZJOI2010 count 数字计数 Description 给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次. Input 输入文件中仅包含一行两个整数a.b,含义如上所述. Output 输出文件中包含一行10个整数,分别表示0-9在[a,b]中出现了多少次. Sample Input 1 99 Sample Output 9 20 20 20 20 20 20 20 20 20 HINT 30%的数据中,a<=b<=10^6:…
题目 传送门:QWQ 分析 蒟蒻不会数位dp,又是现学的 用$ dp[i][j][k] $ 表示表示长度为i开头j的所有数字中k的个数 然后预处理出这个数组,再计算答案 代码 #include <bits/stdc++.h> using namespace std; typedef long long ll; ll dp[][][], ans[], b[], sum[]; int solve(ll x,ll d){ ; ll bef=x; ){ b[++len]=x%; } ;i<len…
题意:数字满足的条件是该数字可以被它的每一位非零位整除. 分析:大概的思路我是可以想到的 , 但没有想到原来可以这样极限的化简 , 在数位dp 的道路上还很长呀 : 我们都知道数位dp 的套路 , 核心的部分就是找到判断这个数的满足条件的方法 , 如果找到了那这个问题就迎刃而解了吧 : 这个题的条件是数字被每一位非零的数整除,那是不是这个是应该被每一位的最小公倍数整除  ,这里是这道题目的关键!!!!!!!!  1-9的最小公倍数是2520 , 所以其他位数最公倍数都是在2520内的(看这样考虑…