数位\(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;//输出答案
}

最新文章

  1. 最好用的Unity版本控制工具
  2. Express安装过程
  3. Javascript模块化开发,使用模块化脚本加载工具RequireJS,提高你代码的速度和质量。
  4. Python 中文编码问题小结
  5. 屌丝逆袭--Asp.net快速入门学习教程 第1晚
  6. HTML-DIV布局
  7. 异步get请求之代理方法
  8. sqlite数据库方言配置
  9. 【POJ 1679 The Unique MST】最小生成树
  10. SQL Server 2005------函数
  11. 揭秘Kafka高性能架构之道 - Kafka设计解析(六)
  12. python+selenium自动化软件测试(第1章):环境搭建,你也可以直接用Anaconda!
  13. Mysql篇--Linux中安装Mysql
  14. sql server 性能调优之 资源等待之网络I/O
  15. 查找单链表中倒数第K个位置上的结点,若查找成功返回该节点的data域,若不成功只返回0
  16. 原子性: Interlocked 类
  17. Linux常用命令4(grep、df、du、awk、su、ll)
  18. Rational Rose 2003 下载及破解方法
  19. android 网络检测
  20. state介绍

热门文章

  1. WPF Datagrid 动态生成列 并绑定数据
  2. fis3打包中的一些注意事项
  3. 【转】SQL中GROUP BY语句与HAVING语句的使用
  4. 趣谈Linux操作系统学习笔记:第二十一讲
  5. thinkphp5.1单模块设置
  6. springboot+mybatisplus+sharding-jdbc分库分表实例
  7. Centos7 下cobbler安装及配置
  8. WebSocket数据加密——AES与RSA混合加密
  9. MySQL 中的索引
  10. java基础(15):常用API(Object、String、StringBuffer)