数位\(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. Tomcat 设置JVM内存大小

    我的服务器的配置: # OS specific support.  $var _must_ be set to either true or false. JAVA_OPTS="-Xms10 ...

  2. 描述符(__get__和__set__和__delete__)

    目录 一.描述符 二.描述符的作用 2.1 何时,何地,会触发这三个方法的执行 三.两种描述符 3.1 数据描述符 3.2 非数据描述符 四.描述符注意事项 五.使用描述符 5.1 牛刀小试 5.2 ...

  3. 05-Django模型(2)

    1.特殊查询 F和Q查询: 之前的查询都是模型对象的属性与常量值比较,两个属性怎么比较呢?使用F查询. F查询语法: from django.db.models import F F('属性名称') ...

  4. jQuery 源码分析(十二) 数据操作模块 html特性 详解

    jQuery的属性操作模块总共有4个部分,本篇说一下第1个部分:HTML特性部分,html特性部分是对原生方法getAttribute()和setAttribute()的封装,用于修改DOM元素的特性 ...

  5. 面试必问的Spring IOC详解

    广义的 IOC IoC(Inversion of Control) 控制反转,即“不用打电话过来,我们会打给你”. 两种实现: 依赖查找(DL)和依赖注入(DI). IOC 和 DI .DL 的关系( ...

  6. sed命令:删除匹配行和替换

    删除以a开头的行 sed -i '/^a.*/d' tmp.txt -i 表示操作在源文件上生效.否则操作内存中数据,并不写入文件中.在分号内的/d表示删除匹配的行 替换匹配行: sed -i 's/ ...

  7. 记一次token安全认证的实践

    阅读此文前请先阅读上一篇SpringBoot整合JWT实现用户认证了解JWT. 背景介绍: 因项目需求,有PC端 APP端和小程序端,但登陆接口是同一个,然而微服务也无法使用传统的session解决用 ...

  8. SpringBoot2.0.4部署在tomcat容器中

    1.  修改启动类继承自SpringBootServletInitializer. 2. 重写config方法: @Overrideprotected SpringApplicationBuilder ...

  9. Core源码(五)IQueryable(转)

    如果要对Iqueryable进行深入的学习,那么对于拉姆达表达式.委托需要有一定了解.这里面拉姆达表达式就是匿名函数的一种写法,而委托我们常用FUNC和ACTION,这个都是对于delegate委托的 ...

  10. vs2017 发布工具 Installer 发包遇到的问题处理

    一. 遇到的问题. ERROR: 要在“系统必备”对话框中启用“从与我的应用程序相同的位置下载系统必备组件”,必须将“Microsoft .NET Framework 4.7.2 (x86 和 x64 ...