【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;
- }
【bzoj3329】Xorequ 数位dp+矩阵乘法的更多相关文章
- BZOJ 3329: Xorequ [数位DP 矩阵乘法]
3329: Xorequ 题意:\(\le n \le 10^18\)和\(\le 2^n\)中满足\(x\oplus 3x = 2x\)的解的个数,第二问模1e9+7 \(x\oplus 2x = ...
- bzoj 3329: Xorequ【数位dp+矩阵乘法】
注意第一问不取模!!! 因为a+b=a|b+a&b,a^b=a|b-a&b,所以a+b=a^b+2(a&b) x^3x==2x可根据异或的性质以转成x^2x==3x,根据上面的 ...
- BZOJ3329 Xorequ(数位DP)
题目大意:x xor 2x=3x(与x xor 3x=2x等价)求满足等式且小于n的x的个数,与满足等式小于2n的数的个数. 因为异或是不进位的二进制加法,那么因为结果正好和加法相同,那么说明x在二进 ...
- 【BZOJ 3326】[Scoi2013]数数 数位dp+矩阵乘法优化
挺好的数位dp……先说一下我个人的做法:经过观察,发现这题按照以往的思路从后往前递增,不怎么好推,然后我就大胆猜想,从前往后推,发现很好推啊,维护四个变量,从开始位置到现在有了i个数 f[i]:所有数 ...
- BZOJ 3329 Xorequ 数字DP+矩阵乘法
标题效果:特定n,乞讨[1,n]内[1,2^n]差多少x满足x^3x=2x x^3x=2x相当于x^2x = 3x 和3x=x+2x 和2x=x<<1 因此x满足条件IFFx&(x ...
- BZOJ3329 Xorequ[数位DP+递推矩阵快速幂]
数 位 D P 开 long long 首先第一问是转化. 于是就可以二进制下DP了. 第二问是递推,假设最后$n-1$个01位的填法设为$f[i-1]$(方案包括 ...
- 【bzoj2004】[Hnoi2010]Bus 公交线路 状压dp+矩阵乘法
题目描述 小Z所在的城市有N个公交车站,排列在一条长(N-1)km的直线上,从左到右依次编号为1到N,相邻公交车站间的距离均为1km. 作为公交车线路的规划者,小Z调查了市民的需求,决定按下述规则设计 ...
- BZOJ3329 Xorequ(数位dp+矩阵快速幂)
显然当x中没有相邻的1时该式成立,看起来这也是必要的. 于是对于第一问,数位dp即可.第二问写出dp式子后发现就是斐波拉契数列,矩阵快速幂即可. #include<iostream> #i ...
- BZOJ3329: Xorequ(二进制数位dp 矩阵快速幂)
题意 题目链接 Sol 挺套路的一道题 首先把式子移一下项 \(x \oplus 2x = 3x\) 有一件显然的事情:\(a \oplus b \leqslant c\) 又因为\(a \oplus ...
随机推荐
- python剑指offer 合并两个排序的链表
题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. # -*- coding:utf-8 -*- # class ListNode: # def _ ...
- java调用摄像头
http://blog.csdn.net/xing_sky/article/details/43482213 原文地址:http://blog.csdn.net/zajin/article/detai ...
- mahout算法解析
1.下载ubuntu的iso 2.安装虚拟机,vmware,最好英文原版 3.在vm里面安装ubuntu,安装vm tools 4.本地连接设置为共享上网,虚拟机采用NAT,打开ubuntu,自动连接 ...
- 标准对象 -------JavaScript
本文摘要:http://www.liaoxuefeng.com/ 在JavaScript的世界里,一切都是对象. 但是某些对象还是和其他对象不太一样.为了区分对象的类型,我们用typeof操作符获取对 ...
- jrtplib库使用简解
RTP有效载荷类型即时间截解释 =============================== https://www.cnblogs.com/wyqfighting/archive/2013/03/ ...
- UNIX网络通信
一.网络协议 国际标准化组织(ISO)定义了网络协议的基本框架,被称为OSI模型.OSI模型包括应用层.表示层.会话层.传输层.网络层.数据链路层及物理层.而OSI模型过于复杂至今没有得到实际的应用. ...
- React学习记录一
半路出家直接上手React,其实有点吃力,所以开始研究create-react-app,从这里下手吧. create-react-app 官方网站:https://github.com/faceboo ...
- pycharm配置Git托管
利用Pycharm和github管理代码转载https://www.cnblogs.com/feixuelove1009/p/5955332.html git教程--廖雪峰git教程 转载https ...
- vscode运行C/C++程序及配置
安装vscdoe,安装tdm-gcc-64编译器,这样可以自动把mingw的目录添加到环境变量中,其实安装其他编译器本版都可以,只要手动添加环境变量即可.平台win10-64位.此文参考了哔哩哔哩的配 ...
- makefile学习(1)
GNU Make / Makefile 学习资料 GNU Make学习总结(一) GNU Make学习总结(二) 这篇学习总结,从一个简单的小例子开始,逐步加深,来讲解Makefile的用法. 最后用 ...