【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\),然后在线段树上修改子树内的值. 对于询问操作, ...
随机推荐
- LVS负载均衡实现双向热备
一.LVS1服务器配置 安装ipvsadm,keepalived [root@localhost ~]# yum -y install ipvsadm keepalived 配置keepalivedd ...
- c#汉字转拼音首字母全拼支持多音字
1.首先在NuGet安装pingyinConverter 2.下载-安装-引用ChineseChar.dll到项目中 官网了解:http://www.microsoft.com/zh-cn/downl ...
- 【MySQL】MySQL 8.0的SYS视图
MySQL的SYS视图 MySQL8.0的发展越来越趋同与Oracle,为了更好的监控MySQL的一些相关指标,出现了SYS视图,用于监控. 1.MySQL版本 (root@localhost) [s ...
- 知识图谱辅助金融领域NLP任务
从人工智能学科诞生之初起,自然语言处理(NLP)就是人工智能核心的研究问题之一.NLP的重要性是毋庸置疑的,它能够实现以自然语言交流为特征的高级人机交互,使机器能“阅读”所有以文字形式记录的人类知识, ...
- javascript检索某个字符或字符串在源字符串中的位置(下标)
indexOf()方法 JavaScript中的String对象提供了一个indexOf(searchValue, fromIndex)方法用于检索某个字符或字符串在源字符串中第一次出现的位置(下标) ...
- Mac下如何复制webp图片
将 WebP 格式图片拖到 Chrome 浏览器标签栏中(浏览器是肯定支持查看的,而且是 Google 自家的),这个时候图片是能够正常查看的.我们右键选中图片,选择「复制图片」. 打开 macO ...
- WPF 使用动画设置特殊值的方法
例如设置Visibility属性时: 第一种方式: <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(UIEleme ...
- ASP.NET Core基于K8S的微服务电商案例实践--学习笔记
摘要 一个完整的电商项目微服务的实践过程,从选型.业务设计.架构设计到开发过程管理.以及上线运维的完整过程总结与剖析. 讲师介绍 产品需求介绍 纯线上商城 线上线下一体化 跨行业 跨商业模式 从0开始 ...
- C# 判断(Excel)文件是否已经打开
using System.IO; using System.Runtime.InteropServices; [DllImport("kernel32.dll")] publi ...
- python基础(17):正则表达式
1. 正则表达式 1.1 正则表达式是什么 正则表达式本身也和python没有什么关系,就是匹配字符串内容的一种规则. 官方定义:正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符 ...