Problem Description As we know, Rikka is poor at math. Yuta is worrying about this situation, so he gives Rikka some math tasks to practice. There is one of them: Yuta has an array A of length n,and the ith element of A is equal to the sum of all dig…
提取2的幂 这个方法用代码实现貌似有点麻烦,需要探测大小,我只实现了整数十进制到二进制的转化 /* * 提取2的幂 */ public static String TenToBin1(int ten) { int index = 0; StringBuffer binBuffer = new StringBuffer(); //int类型是4个字节,32位,找到刚好大于输入的数的位置 for(int i = 0; i <= 32; i++) { if((int)(Math.pow(2, i))…
打了几个数位$dp$,发现自己除了会打模板之外没有任何长进,遇到非模板题依然什么都不会 那么接下来这篇文章将介绍如何打模板(滑稽) 假设我们要处理$l----r$ 采用记忆化搜索的方式,枚举$<=r$每一种情况,枚举每一位,然后再枚举$<=l-1$每一种情况,然后两个值相减即可 我们可以比较轻松打出一个模板 ll dfs(ll x,ll pre,ll lead,ll limit){ if(x>pos) return 1; if(!limit&&f[x][pre]) ret…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5587 题目大意就是初始有一个1,然后每次操作都是先在序列后面添加一个0,然后把原序列添加到0后面,然后从0到末尾,每一个都加上1. 例如:a0, a1, a2 => a0, a1, a2, 1, a0+1, a1+1, a2+1 题解中是这么说的:“ 其实Ai为i二进制中1的个数.每次变化A{k+2^i}=A{k}+1,(k<2^​i​​)不产生进位,二进制1的个数加1.然后数位dp统计前m个数二…
在了解数位dp之前,先来看一个问题: 例1.求a~b中不包含49的数的个数. 0 < a.b < 2*10^9 注意到n的数据范围非常大,暴力求解是不可能的,考虑dp,如果直接记录下数字,数组会开不起,该怎么办呢?要用到数位dp. 数位dp一般应用于: 求出在给定区间[A,B]内,符合条件P(i)的数i的个数. 条件P(i)一般与数的大小无关,而与 数的组成 有关. 这样,我们就要考虑一些特殊的记录方法来做这道题.一般来说,要保存给定数的每个位置的数.然后要记录的状态为当前操作数的位数,剩下的…
数位dp有着很明显的特点,一般来说是给定区间[l,r]求满足某种条件区间中的数有多少个 朴素解法一般是O(n)的而n往往很大(10^8起步) 这时候我们就要想办法优化,于是就有了数位dp 数位有两个基本的原则 对于区间数的个数,我们转化为前缀和做(即ans=sum(r)-sum(l-1)) 逐位确定 我认为第二条很关键,可以说是数位dp的精髓 一般来说数位dp分两步 打表 形如f[i,j]到有i位且最高位为j的满足条件的个数 统计前缀和 统计前缀和我们需要用到一个非常重要的结论 对于任意一个小于…
推荐以下一篇博客:https://blog.csdn.net/wust_zzwh/article/details/52100392 1.(HDOJ2089)http://acm.hdu.edu.cn/showproblem.php?pid=2089 分析:裸模板题 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; typedef long long ll; ]; ][]…
题意有点难以描述,简略的就是给定一个二进制\(n\),每一步操作能使\(n\)的位为1的数的和转化为一个十进制,然后转化为该数的二进制再进行相同的操作 查询\([0,n]\)中操作数恰好为\(k\)的使该数最终降为1的个数 注意,\(1_{(2)}\)的操作数是0 n的范围非常大可以想到是数位DP,并且它递减得非常快所以k其实连10都不到就不需统计了 Update:发现代码部分地方写sb了,不过影响不大 #include<iostream> #include<algorithm>…
[背景] 在10月3日的dp专练中,压轴的第6题是一道数位dp,于是各种懵逼. 为了填上这个留存已久的坑,蒟蒻chty只能开坑数位dp了. [例题一][HDU2089]不要62 题目大意:给你一个区间[l,r],求区间内不含4和62的数的个数. 分析:首先  ans[l,r]=ans[0,r]-ans[0,l-1],这样成功将问题转化为了求区间[0,x]的答案,然后减一下即可. 然后可以预处理出一个f[][]数组,f[i][j]表示表示在i位数中以j开头的满足条件的数的个数,那么显然f[i][j…