数位\(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)的更多相关文章

  1. 【2019.8.20 NOIP模拟赛 T2】小B的树(tree)(树形DP)

    树形\(DP\) 考虑设\(f_{i,j,k}\)表示在\(i\)的子树内,从\(i\)向下的最长链长度为\(j\),\(i\)子树内直径长度为\(k\)的概率. 然后我们就能发现这个东西直接转移是几 ...

  2. 【2019.7.20 NOIP模拟赛 T1】A(A)(暴搜)

    打表+暴搜 这道题目,显然是需要打表的,不过打表的方式可以有很多. 我是打了两个表,分别表示每个数字所需的火柴棒根数以及从一个数字到另一个数字,除了需要去除或加入的火柴棒外,至少需要几根火柴棒. 然后 ...

  3. 【2019.8.20 NOIP模拟赛 T3】小X的图(history)(可持久化并查集)

    可持久化并查集 显然是可持久化并查集裸题吧... 就是题面长得有点恶心,被闪指导狂喷. 对于\(K\)操作,直接\(O(1)\)赋值修改. 对于\(R\)操作,并查集上直接连边. 对于\(T\)操作, ...

  4. 【2019.7.16 NOIP模拟赛 T2】折叠(fold)(动态规划)

    暴力\(DP\) 考虑暴力\(DP\),我们设\(f_{i,j}\)表示当前覆盖长度为\(i\),上一次折叠长度为\(j\)的方案数. 转移时需要再枚举这次的折叠长度\(k\)(\(k\ge j\)) ...

  5. 【2019.7.15 NOIP模拟赛 T2】与非树(nand)(树形DP)

    树形\(DP\) 实际上,这道题应该不是很难. 我们设\(f_{x,i,j}\)表示在以\(x\)为根的子树内,原本应输出\(i\),结果输出了\(j\)的情况数. 转移时,为了方便,我们先考虑与,再 ...

  6. (计数器)NOIP模拟赛(神奇的数位DP题。。)

    没有原题传送门.. 手打原题QAQ [问题描述]     一本书的页数为N,页码从1开始编起,请你求出全部页码中,用了多少个0,1,2,…,9.其中—个页码不含多余的0,如N=1234时第5页不是00 ...

  7. 2019.7.26 NOIP 模拟赛

    这次模拟赛真的,,卡常赛. The solution of T1: std是打表,,考场上sb想自己改进匈牙利然后wei了(好像匈牙利是错的. 大力剪枝搜索.代码不放了. 这是什么神仙D1T1,爆蛋T ...

  8. 20161003 NOIP 模拟赛 T2 解题报告

    Weed duyege的电脑上面已经长草了,经过辨认上面有金坷垃的痕迹. 为了查出真相,duyege 准备修好电脑之后再进行一次金坷垃的模拟实验. 电脑上面有若干层金坷垃,每次只能在上面撒上一层高度为 ...

  9. 【2019.7.25 NOIP模拟赛 T3】树(tree)(dfs序列上开线段树)

    没有换根操作 考虑如果没有换根操作,我们该怎么做. 我们可以求出原树的\(dfs\)序列,然后开线段树维护. 对于修改操作,我们可以倍增求\(LCA\),然后在线段树上修改子树内的值. 对于询问操作, ...

随机推荐

  1. 使用composer安装Larave提示“Changed current directory to C:/Users/Administrator/AppData/Roaming/Composer”

    解决办法: 根据官方手册执行composer global require "laravel/installer" 显示Changed current directory to C ...

  2. Maven配置教程

    Maven的下载 在Maven的官网即可下载,点击访问Apache Maven. 下载后解压即可,解压后目录结构如下: Maven常用配置 在配置之前请将JDK安装好. 1. 环境变量配置 添加M2_ ...

  3. RestTemplate调用接口(附有账号密码)

    private JSONObject Post(String url, String payload, String username, String password) { RestTemplate ...

  4. 【LOJ#6682】梦中的数论(min_25筛)

    [LOJ#6682]梦中的数论(min_25筛) 题面 LOJ 题解 注意题意是\(j|i\)并且\((j+k)|i\), 不难发现\(j\)和\((j+k)\)可以任意取\(i\)的任意因数,且\( ...

  5. win7系统下安装Ubuntu18.04组成双系统

    最近在闲鱼上花了350大洋淘到了一台tinkpad sl510,这大概是一台发布于2009年的一台电脑了吧,处理器是酷睿二t440,2Gddr3的显卡,让我有点意外的是这台电脑的硬盘是7200转的32 ...

  6. mosquitto配置文件

    #配置文件为mosquitto #参见mosquitto.conf(5)了解更多信息. #显示默认值,取消注释以更改. #使用#字符来表示注释,但只有当它是 #第一个字符就行了. #========= ...

  7. JAVA----HelloWorld

    1.步骤 将java代码编写到扩展名为.java的文件中(扩展名的查看) 新建文本文档,重命名为Test.java. 以记事本方式打开. 写入代码. public class Test{       ...

  8. MySQL数据库的事务及存储引擎

    一.关系型数据库与非关系型数据库 1.关系型数据库的特点: 1)数据以表格的形式出现 2)每行为各种记录名称 3)每列为记录名称所对应的数据域 4)许多的行和列组成一张表单 5)若干的表单组成数据库 ...

  9. 如何将HTML页面中的文本设置首行缩进

    text-indent属性介绍 属性值单位 描述 em 比如:1em 就代表缩进1个字,2em缩进2个字...... 由于简单我就不过多的介绍了直接上代码了哦,注意:text-indent属性的值支持 ...

  10. CTF 入门笔记

    站点:http://www.moctf.com/ web1:水题非常简单的题目,直接F12查看元素即可,在HTML代码中,flag被注释了. web2:水题 该题的核心 就是通过HTML代码对输入框进 ...