数位DP

昨天的B题,excited

又学习了一下数位dp...

数位dp要考虑几个比较重要的东西:1.前导0,2.天际线,3.记忆化的条件,4.细节

经常数位dp会问我们l->r区间中满足某某条件的数的个数,这个条件很明显满足可减性,所以一般转化为1->r的数-1->l-1的数,采用记忆化搜索的方式统计

这道题状态为dp[base][bit][state][pre],表示当前底数为base,统计的数有bit位,每种数出现次数用state表示,有没有前导0

然后考虑状态的改变,也就是前导0,天际线的变化,先考虑前导0的变化,如果当前放置的数不是0,那么前导0不存在,可以把这个数放进状态内,否则如果一直是前导0则不把前导0放入状态,前导0也要设进dp状态内;然后考虑天际线,我们先想一想所设的dp状态,dp[base][bit][state][pre],这是表示当前base下,这个数包括前导0,状态为state,有没有前导0,注意这个数是包括所有位数为bit的数,如果我们在记忆化搜索的时候碰到了天际线,也就是limit=1,那么我们不能对搜出的结果记忆化,也不能返回之前已经记忆化好的答案,因为天际线去除掉了一些数,而dp统计了所有长度为bit的数。

这样能够保证所有的数都被统计进去吗?是可以的,我们统计了天际线及以下长度为bit的数,但是那些长度小于bit的呢?其实我们把这些数转换为了加上前导零的数,这样就能很好地统计了。

所以数位dp我们要考虑1.前导0的变化,2.是否卡在天际线,3.dp状态不同情况下的变化,4.记忆化的条件,5.每次枚举第bit位是什么的范围,然后通过记忆化搜索实现。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int q;
ll dp[][][][], f[];
ll dfs(int base, int bit, int S, int pre, int limit) //flag = 2 超了 flag = 1正好 flag = 0 小了
{
if(bit == ) return !S;
if(!limit && dp[base][bit][S][pre] != -) return dp[base][bit][S][pre];
ll ret = ;
int mx = limit ? f[bit] : base - ;
for(int i = ; i <= mx; ++i)
{
if(i == && pre) ret += dfs(base, bit - , S, pre, limit && (i == mx));
else ret += dfs(base, bit - , S ^ ( << i), , limit && (i == mx));
}
if(!limit) dp[base][bit][S][pre] = ret;
return ret;
}
ll solve(int base, ll lim)
{
f[] = ;
while(lim)
{
f[++f[]] = lim % base;
lim /= base;
}
return dfs(base, f[], , , );
}
int main()
{
memset(dp, -, sizeof(dp));
scanf("%d", &q);
while(q--)
{
int base;
ll l, r;
scanf("%d%lld%lld", &base, &l, &r);
printf("%lld\n", solve(base, r) - solve(base, l - ));
}
return ;
}

855E的更多相关文章

  1. Codeforces 855E - Salazar Slytherin's Locket

    855E - Salazar Slytherin's Locket 题意 给出一个区间,问这个区间内有多少个数满足,将这个数转化为某个进制后,所有数的数量都为偶数. 分析 谁能想到 数位DP 的裸题竟 ...

  2. Salazar Slytherin's Locket CodeForces - 855E

    Salazar Slytherin's Locket CodeForces - 855E http://www.cnblogs.com/ftae/p/7590187.html 数位dp: http:/ ...

  3. utf-8 汉字对照表

    之前从redis中取出一些数据,utf8 16进制编码,想转成字符,没有找到现成的转化工具,先用这个表直接查找对照吧. UTF8编码表大全Code code# Code (coded in UTF-8 ...

  4. JS base64 加密和 后台 base64解密(防止中文乱码)

    直接上代码 1,js(2个文件,网上找的)  不要觉的长,直接复制下来就OK //UnicodeAnsi.js文件 //把Unicode转成Ansi和把Ansi转换成Unicode function ...

  5. 基于nodejs实现js后端化处理

    今天D哥给我提了个问题,"用php执行过js没"?咋一听,没戏~~毕竟常规情况下,js是依赖浏览器运行的.想在php后端采集的同时利用js运行结果并传递给php使用,没戏! 然后回 ...

  6. utf8汉字编码16进制对照

           utf8汉字编码16进制对照  GB    Unicode  UTF-8     Chinese Character Code  code# Code      (coded in UT ...

  7. Html5模拟通讯录人员排序(sen.js)

    // JavaScript Document var PY_Json_Str = ""; var PY_Str_1 = ""; var PY_Str_2 = & ...

  8. Base64 JAVA后台编码与JS前台解码(解决中文乱码问题)

    中文通过Java后台进行Base64编码后传到前台,通过JS进行Base64解码时会出现中文乱码的问题,被这个问题也是困扰了几天,使用jquery.base64.js只能转码非中文字符,经过搜集各种方 ...

  9. 将table导出为excel格式文件

    html: <table cellpadding="0" cellspacing="0" class="data_table" id= ...

随机推荐

  1. private、protected和public的区别

    private 是完全私有的,只有当前类中的成员能访问到. protected 是受保护的,只有当前类的成员与继承该类的类才能访问. 这两个是访问类中成员权限的限制符.在类外如果想使用类中的成员,只能 ...

  2. 在后台根据单据标识构建单据的DynamicObject,然后调用BOS的保存服务保存单据。

    var bussnessInfo = Kingdee.BOS.ServiceHelper.MetaDataServiceHelper.GetFormMetaData(this.Context, &qu ...

  3. spring boot 没有主清单属性

  4. Django学习之 - 基础视图函数

    视图:Views 获取用户请求的方法: 1: request.GET 2: request.POST 3: request.FILES # checkbox 等多选文件 4:request.POST. ...

  5. 1370 - Bi-shoe and Phi-shoe(LightOJ1370)(数论基础,欧拉函数)

    http://lightoj.com/volume_showproblem.php?problem=1370 欧拉函数: 在数论,对正整数n,欧拉函数是少于或等于n的数中与n互质的数的数目. φ(n) ...

  6. 洛谷——P3353 在你窗外闪耀的星星

    P3353 在你窗外闪耀的星星 题目描述 飞逝的的时光不会模糊我对你的记忆.难以相信从我第一次见到你以来已经过去了3年.我仍然还生动地记得,3年前,在美丽的集美中学,从我看到你微笑着走出教室,你将头向 ...

  7. 【algorithm】尾递归

    尾递归和一般的递归不同在对内存的占用,普通递归创建stack累积而后计算收缩,尾递归只会占用恒量的内存(和迭代一样).SICP中描述了一个内存占用曲线,用以上答案中的Python代码为例(普通递归): ...

  8. requests库帮助

    requests库帮助 http://docs.python-requests.org/zh_CN/latest/user/quickstart.html

  9. 一处折腾笔记:Android内嵌html5加入原生微信分享的解决的方法

    有一段时间没有瞎折腾了. 这周一刚上班萌主过来反映说:微信里面打开聚客宝.分享功能是能够的(这里是用微信自身的js-sdk实现的).可是在android应用里面打开点击就没反应了:接下来狡猾的丁丁在产 ...

  10. AspNetPager真假分页对照实例

    从開始学习BS已经有一段时间了. 对于BS的设计,都是进行的网页设计,当中包含从数据库中取出来的数据.显示在页面上.曾经在CS中,都是使用GridView等表格控件进行显示,因为数据小.并且右側又有滚 ...