【bzoj3329】Xorequ 数位dp+矩阵乘法
题目描述
输入
第一行一个正整数,表示数据组数据 ,接下来T行
每行一个正整数N
输出
2*T行
第2*i-1行表示第i个数据中问题一的解,
第2*i行表示第i个数据中问题二的解,
样例输入
1
1
样例输出
1
2
题解
数位dp+矩阵乘法
$x\ xor\ 3x=2x$即$x\ xor\ 2x=3x$。而亦或的运算规则为“相同为0,不同为1”,也就是说当且仅当$a\ and\ b$不为0,即有共同的位是1时,$a\ xor\ b\neq a+b$。
所以如果$x$满足条件,则$x$与$2x$没有共同的某位为1,即要求$x$没有连续的两位为1。
那么就可以考虑dp。
设$f[i]$表示$i$位数(可能包含前导零)没有连续的两位为1的数的个数,那么$f[i]$的递推式为斐波那契数列$f[i]=f[i-1]+f[i-2]$,边界条件$f[0]=1,f[1]=2$。
第一问上一个数位dp即可。
第二问直接上矩阵乘法求斐波那契数列即可。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
const ll mod = 1000000007;
struct data
{ll v[2][2];data() {memset(v , 0 , sizeof(v));}data operator*(const data &a)const{data ans;int i , j , k;for(i = 0 ; i < 2 ; i ++ )for(j = 0 ; j < 2 ; j ++ )for(k = 0 ; k < 2 ; k ++ )ans.v[i][j] = (ans.v[i][j] + v[i][k] * a.v[k][j]) % mod;return ans;}
}A , ANS;
ll f[65] , g[65];
data pow(data x , ll y)
{data ans;ans.v[0][0] = ans.v[1][1] = 1;while(y){if(y & 1) ans = ans * x;x = x * x , y >>= 1;}return ans;
}
int getp(ll n)
{int ans = 0;while(n) n >>= 1 , ans ++ ;return ans;
}
void init()
{int i;A.v[1][0] = A.v[0][1] = A.v[1][1] = 1;f[0] = 1 , f[1] = 2;for(i = 2 ; i <= 62 ; i ++ ) f[i] = f[i - 1] + f[i - 2];
}
ll calc(ll n , int len)
{if(len <= 1) return n + 1;else if(!(n & (1ll << (len - 1)))) return calc(n , len - 1);else if(n & (1ll << (len - 2))) return f[len - 1] + calc((1ll << (len - 2)) - 1 , len - 1);else return f[len - 1] + calc(n - (1ll << (len - 1)) , len - 1);
}
int main()
{init();int T;scanf("%d" , &T);while(T -- ){ll n;scanf("%lld" , &n);printf("%lld\n" , calc(n , getp(n)) - 1);printf("%lld\n" , pow(A , n + 1).v[1][1]);}return 0;
}
转载于:https://www.cnblogs.com/GXZlegend/p/7450186.html
【bzoj3329】Xorequ 数位dp+矩阵乘法相关推荐
- 【BZOJ 3326】[Scoi2013]数数 数位dp+矩阵乘法优化
挺好的数位dp-- 先说一下我个人的做法: 经过观察,发现这题按照以往的思路从后往前递增,不怎么好推,然后我就大胆猜想,从前往后推,发现很好推啊,维护四个变量,从开始位置到现在有了i个数 f[i]:所 ...
- BZOJ 3329 Xorequ (数位DP、矩阵乘法)
BZOJ 3329 Xorequ (数位DP.矩阵乘法) 手动博客搬家: 本文发表于20181105 23:18:54, 原地址https://blog.csdn.net/suncongbo/arti ...
- bzoj 3329: Xorequ(DP+矩阵快速幂)
3329: Xorequ Time Limit: 1 Sec Memory Limit: 256 MB Submit: 1134 Solved: 491 [Submit][Status][Disc ...
- 51nod1836-战忽局的手段【期望dp,矩阵乘法】
正题 题目连接:http://www.51nod.com/Challenge/Problem.html#problemId=1836 题目大意 nnn个点mmm次随机选择一个点标记(可以重复),求最后 ...
- P3193-[HNOI2008]GT考试【KMP,dp,矩阵乘法】
正题 题目链接:https://www.luogu.com.cn/problem/P3193 题目大意 求有多少个长度为nnn的字符串不包含子串sss. 解题思路 考虑dpdpdp,用fi,jf_{i ...
- P5004-专心OI - 跳房子【dp,矩阵乘法】
正题 题目链接:https://www.luogu.org/problemnew/show/P5004 题目大意 把NNN个无色格子排成一行,可以把某些格子染成黑色,但两个黑色格子之间必须至少有MMM ...
- BZOJ 3329: Xorequ(数位dp+递推)
传送门 解题思路 可以把原式移项得\(x\)^\(2x\)=\(3x\),而\(x+2x=3x\),说明\(x\)二进制下不能有两个连续的\(1\).那么第一问就是一个简单的数位\(dp\),第二问考 ...
- 【BZOJ 2323】 2323: [ZJOI2011]细胞 (DP+矩阵乘法+快速幂*)
2323: [ZJOI2011]细胞 Description 2222年,人类在银河系外的某颗星球上发现了生命,并且携带了一个细胞回到了地球.经过反复研究,人类已经完全掌握了这类细胞的发展规律: 这种 ...
- loj#2002. 「SDOI2017」序列计数(dp 矩阵乘法)
题意 题目链接 Sol 质数的限制并没有什么卵用,直接容斥一下:答案 = 忽略质数总的方案 - 没有质数的方案 那么直接dp,设\(f[i][j]\)表示到第i个位置,当前和为j的方案数 \(f[i ...
最新文章
- spring boot jpa级联保存
- html中嵌入iframe进行父子页面参数传递
- php 购物车封装代码,PHP中封装Redis购物车功能
- ESFramework介绍之(14)-- AS与FS通信方案
- python中文语法提示_Python官方中文文档上线了:各种教程已汉化,不用再苦等野生翻译...
- Andoid游戏【真情表白】让你心爱的人在游戏中感受真情!
- JavaWeb:重定向(redirect)和转发(forward)的区别
- 系统集成项目管理工程师证书有什么用?
- 龙芯2F Debain编openssl报/usr/local/bin/ld: /usr/lib/libdl.so: error adding symbols: file in wrong format
- python文件同时读写_python可以同时对文件进行读写操作吗
- Magic Cube
- MySQL数据库基础-----多表查询
- HDMI光纤线,英文称呼:hdmi AOC Cable,又被称为有源光缆。
- c++多线程 CMakeLists设置
- 强制覆盖组件原本样式
- redis集群报错:(error) MOVED 解决方法
- SQL更新(INSERT,UPDATE,DELETE)语句的一般格式及注意事项
- 在python中创建一个具有特定大小的空列表
- 国际标准 ISO 11898 解读
- ASML后悔莫及,中国芯片选用国产和日本光刻机,它并非不可替代