题目描述

输入

第一行一个正整数,表示数据组数据 ,接下来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+矩阵乘法相关推荐

  1. 【BZOJ 3326】[Scoi2013]数数 数位dp+矩阵乘法优化

    挺好的数位dp-- 先说一下我个人的做法: 经过观察,发现这题按照以往的思路从后往前递增,不怎么好推,然后我就大胆猜想,从前往后推,发现很好推啊,维护四个变量,从开始位置到现在有了i个数 f[i]:所 ...

  2. BZOJ 3329 Xorequ (数位DP、矩阵乘法)

    BZOJ 3329 Xorequ (数位DP.矩阵乘法) 手动博客搬家: 本文发表于20181105 23:18:54, 原地址https://blog.csdn.net/suncongbo/arti ...

  3. bzoj 3329: Xorequ(DP+矩阵快速幂)

    3329: Xorequ Time Limit: 1 Sec  Memory Limit: 256 MB Submit: 1134  Solved: 491 [Submit][Status][Disc ...

  4. 51nod1836-战忽局的手段【期望dp,矩阵乘法】

    正题 题目连接:http://www.51nod.com/Challenge/Problem.html#problemId=1836 题目大意 nnn个点mmm次随机选择一个点标记(可以重复),求最后 ...

  5. P3193-[HNOI2008]GT考试【KMP,dp,矩阵乘法】

    正题 题目链接:https://www.luogu.com.cn/problem/P3193 题目大意 求有多少个长度为nnn的字符串不包含子串sss. 解题思路 考虑dpdpdp,用fi,jf_{i ...

  6. P5004-专心OI - 跳房子【dp,矩阵乘法】

    正题 题目链接:https://www.luogu.org/problemnew/show/P5004 题目大意 把NNN个无色格子排成一行,可以把某些格子染成黑色,但两个黑色格子之间必须至少有MMM ...

  7. BZOJ 3329: Xorequ(数位dp+递推)

    传送门 解题思路 可以把原式移项得\(x\)^\(2x\)=\(3x\),而\(x+2x=3x\),说明\(x\)二进制下不能有两个连续的\(1\).那么第一问就是一个简单的数位\(dp\),第二问考 ...

  8. 【BZOJ 2323】 2323: [ZJOI2011]细胞 (DP+矩阵乘法+快速幂*)

    2323: [ZJOI2011]细胞 Description 2222年,人类在银河系外的某颗星球上发现了生命,并且携带了一个细胞回到了地球.经过反复研究,人类已经完全掌握了这类细胞的发展规律: 这种 ...

  9. loj#2002. 「SDOI2017」序列计数(dp 矩阵乘法)

    题意 题目链接 Sol 质数的限制并没有什么卵用,直接容斥一下:答案 = 忽略质数总的方案 - 没有质数的方案 那么直接dp,设\(f[i][j]\)表示到第i个位置,当前和为j的方案数 \(f[i ...

最新文章

  1. spring boot jpa级联保存
  2. html中嵌入iframe进行父子页面参数传递
  3. php 购物车封装代码,PHP中封装Redis购物车功能
  4. ESFramework介绍之(14)-- AS与FS通信方案
  5. python中文语法提示_Python官方中文文档上线了:各种教程已汉化,不用再苦等野生翻译...
  6. Andoid游戏【真情表白】让你心爱的人在游戏中感受真情!
  7. JavaWeb:重定向(redirect)和转发(forward)的区别
  8. 系统集成项目管理工程师证书有什么用?
  9. 龙芯2F Debain编openssl报/usr/local/bin/ld: /usr/lib/libdl.so: error adding symbols: file in wrong format
  10. python文件同时读写_python可以同时对文件进行读写操作吗
  11. Magic Cube
  12. MySQL数据库基础-----多表查询
  13. HDMI光纤线,英文称呼:hdmi AOC Cable,又被称为有源光缆。
  14. c++多线程 CMakeLists设置
  15. 强制覆盖组件原本样式
  16. redis集群报错:(error) MOVED 解决方法
  17. SQL更新(INSERT,UPDATE,DELETE)语句的一般格式及注意事项
  18. 在python中创建一个具有特定大小的空列表
  19. 国际标准 ISO 11898 解读
  20. ASML后悔莫及,中国芯片选用国产和日本光刻机,它并非不可替代

热门文章

  1. React基础篇(六)React中绑定事件的注意点
  2. Android中使用系统相机进行拍照并获取高清照片(一)
  3. Python面试笔记二
  4. Oracle RMAN 学习
  5. windows下cmd中命令操作
  6. ROSE User Case View
  7. jQuery原理第三天
  8. element ui table组件扩展关于列表编辑按钮的位置放置
  9. css3和jQuery实现一个简单的标签页效果
  10. 动手学深度学习(PyTorch实现)(三)--过拟合与欠拟合