【2019.7.20 NOIP模拟赛 T2】B(B)(数位DP)
数位\(DP\)
首先考虑二进制数\(G(i)\)的一些性质:
- \(G(i)\)不可能有连续两位第\(x\)位和第\(x+1\)位都是\(1\)。因为这样就可以进位到第\(x+2\)位。其余情况下,这个\(G(i)\)必然合法。
- 对于一对\(x,y\)满足\(x<y\),则\(G(x)<G(y)\)。
则根据这些性质,我们就可以考虑数位\(DP\)。
按照一般数位\(DP\)的套路,我们把对\(a\sim b\)的\(DP\)转化为对\(1\sim a-1\)和\(1\sim b\)的两个\(DP\)。
且我们依然可以通过记一下当前位置是否依然在上界然后进行记忆化优化。
而由于这里不能有连续两位是\(1\)的特殊限制,我们只需记录上一位是否为\(1\)来辅助转移就可以了。
不过此处考虑到我们的目的,是要求异或值,也就是每一位是\(1\)的\(G\)值数量的奇偶性。
那么我们可以枚举二进制下每一位,然后求强制其是\(1\)的方案数的奇偶性即可。
代码
#include<bits/stdc++.h>
#define Tp template<typename Ty>
#define Ts template<typename Ty,typename... Ar>
#define Reg register
#define RI Reg int
#define Con const
#define CI Con int&
#define I inline
#define W while
#define X 1000000007
#define LL long long
using namespace std;
int n;LL a,b,fib[100];
I int GV(bitset<100> s)//求出bitset转化成十进制并取模的值
{
RI i,pw=1,ans=0;for(i=0;i<=n;++i) s.test(i)&&(ans+=pw)>=X&&(ans-=X),(pw<<=1)>=X&&(pw-=X);
return ans;
}
class DigitalDper//数位DP
{
private:
int a[100],f[100][2];bitset<100> s;
I void Init(LL x) {for(RI i=n;~i;--i) fib[i]<=x?a[i]=1,x-=fib[i]:a[i]=0;}//分解上界
I int dfs(CI x,CI k,CI lst,CI flg)//记忆化搜索形式实现数位DP
{
RI lim=((flg&&!a[x])||lst)?0:1;if(x==k)//lim表示此位能取的上界
{
if(!lim) return 0;//如果第k位不能取1,返回0
if(!flg) return ~f[x][lst]?f[x][lst]:f[x][lst]=dfs(x-1,k,1,flg);//如果不在上界,看是否搜过,否则去搜
return dfs(x-1,k,1,flg);//直接搜
}
if(!~x) return 1;if(!flg&&~f[x][lst]) return f[x][lst];//看是否搜过
RI i,res=0;for(i=0;i<=lim;++i) res^=dfs(x-1,k,i,flg&&(i==a[x]));//枚举当前位
return !flg&&(f[x][lst]=res),res;//记忆化
}
public:
I bitset<100> GetAns(Con LL& x)//求答案
{
s.reset(),Init(x);for(RI i=n;~i;--i)//枚举每一位DP
memset(f,-1,sizeof(f)),s[i]=dfs(n,i,0,1);//记录此位结果
return s;//返回结果
}
}D;
int main()
{
freopen("B.in","r",stdin),freopen("B.out","w",stdout);
for(scanf("%lld%lld",&a,&b),fib[0]=1,fib[1]=2,n=2;fib[n-1]<b;++n) fib[n]=fib[n-1]+fib[n-2];--n;//读入+预处理
return printf("%d",GV(D.GetAns(b)^D.GetAns(a-1))),0;//输出答案
}
【2019.7.20 NOIP模拟赛 T2】B(B)(数位DP)的更多相关文章
- 【2019.8.20 NOIP模拟赛 T2】小B的树(tree)(树形DP)
树形\(DP\) 考虑设\(f_{i,j,k}\)表示在\(i\)的子树内,从\(i\)向下的最长链长度为\(j\),\(i\)子树内直径长度为\(k\)的概率. 然后我们就能发现这个东西直接转移是几 ...
- 【2019.7.20 NOIP模拟赛 T1】A(A)(暴搜)
打表+暴搜 这道题目,显然是需要打表的,不过打表的方式可以有很多. 我是打了两个表,分别表示每个数字所需的火柴棒根数以及从一个数字到另一个数字,除了需要去除或加入的火柴棒外,至少需要几根火柴棒. 然后 ...
- 【2019.8.20 NOIP模拟赛 T3】小X的图(history)(可持久化并查集)
可持久化并查集 显然是可持久化并查集裸题吧... 就是题面长得有点恶心,被闪指导狂喷. 对于\(K\)操作,直接\(O(1)\)赋值修改. 对于\(R\)操作,并查集上直接连边. 对于\(T\)操作, ...
- 【2019.7.16 NOIP模拟赛 T2】折叠(fold)(动态规划)
暴力\(DP\) 考虑暴力\(DP\),我们设\(f_{i,j}\)表示当前覆盖长度为\(i\),上一次折叠长度为\(j\)的方案数. 转移时需要再枚举这次的折叠长度\(k\)(\(k\ge j\)) ...
- 【2019.7.15 NOIP模拟赛 T2】与非树(nand)(树形DP)
树形\(DP\) 实际上,这道题应该不是很难. 我们设\(f_{x,i,j}\)表示在以\(x\)为根的子树内,原本应输出\(i\),结果输出了\(j\)的情况数. 转移时,为了方便,我们先考虑与,再 ...
- (计数器)NOIP模拟赛(神奇的数位DP题。。)
没有原题传送门.. 手打原题QAQ [问题描述] 一本书的页数为N,页码从1开始编起,请你求出全部页码中,用了多少个0,1,2,…,9.其中—个页码不含多余的0,如N=1234时第5页不是00 ...
- 2019.7.26 NOIP 模拟赛
这次模拟赛真的,,卡常赛. The solution of T1: std是打表,,考场上sb想自己改进匈牙利然后wei了(好像匈牙利是错的. 大力剪枝搜索.代码不放了. 这是什么神仙D1T1,爆蛋T ...
- 20161003 NOIP 模拟赛 T2 解题报告
Weed duyege的电脑上面已经长草了,经过辨认上面有金坷垃的痕迹. 为了查出真相,duyege 准备修好电脑之后再进行一次金坷垃的模拟实验. 电脑上面有若干层金坷垃,每次只能在上面撒上一层高度为 ...
- 【2019.7.25 NOIP模拟赛 T3】树(tree)(dfs序列上开线段树)
没有换根操作 考虑如果没有换根操作,我们该怎么做. 我们可以求出原树的\(dfs\)序列,然后开线段树维护. 对于修改操作,我们可以倍增求\(LCA\),然后在线段树上修改子树内的值. 对于询问操作, ...
随机推荐
- windows 下命令行启动 appium-desktop
启动appium-desktop如果要启动appium-desktop,双击appium.exe,启动后如下图: 启动appium-server通过下面解决方案直接启动appium-server, ...
- centos7下mysql5.7的安装与配置
centos7下MySQL5.7的安装与配置 下载 下载地址 根据系统和版本选择红框中的四个RPM包下载即可,然后放到centos7系统中的/opt目录下,等待稍后安装. 安装前的准备 1. 检查系统 ...
- 前端之移动端库和框架bootstrap
学习移动端场景下的js事件:制作移动端特效常用的js库:介绍移动端常用开发框架Bootstrap:介绍动态样式语言less.sass.stylus的基本使用. 移动端js事件 移动端的操作方式和PC端 ...
- oracle学习笔记(二十三)——JDBC调用存储过程以及批量操作
jdbc调用存储过程 使用并获得out模式的参数返回值 //存储过程为sum_sal(deptno department.deptno%type,sum in out number) Callable ...
- Java开发桌面程序学习(七)——ImageView设置图片以及jar包读取fxml文件
ImageView设置图片 JavaFx的ImageView,设置图片不能直接通过属性设置,只能通过代码来设置 ImageView设置图片 首先,我们让fxml对应的那个controller的java ...
- Spring框架教程IDEA版-----更新中
补充:设计模式中的工厂模式 设计模式党的主要原则:(1)对接口编程,而不是对实现编程 (2)优先使用对象组合而不是继承 在实现接口的方法时: @Override是伪代码,表示重写.(当然不写@Over ...
- 【hexo+github搭建myblog】bash: npm: command not found 问题,疑似解决!关键词:NPM全局安装路径
情况:打算用hexo+github搭建个人博客 1. hexo搭建,参考博文如下,非常感谢: Hexo+Github博客搭建完全教程 hexo从零开始到搭建完整 问题: 在最基本的安装步骤 (参考链接 ...
- postgreSQL数据库的初探
kali是黑客的强大武器,还有一个也是哦——Metasploit postgreSQL数据库是Metasploit的默认数据库哦! 启动postgresql: service postgresql s ...
- weblogic 安装及配置
修改AdminServer为不需要输入密码的方式开启 : 安装使用的是production模式,不是开发模式,如果要后台启动Weblogic, 需要在如下DOMAIN_HOME/servers/Adm ...
- Android框架Volley使用:Post请求实现
首先我们在项目中导入这个框架: implementation 'com.mcxiaoke.volley:library:1.0.19' 在AndroidManifest文件当中添加网络权限: < ...