题目描述

输入

第一行一个正整数,表示数据组数据 ,接下来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;
}

最新文章

  1. 上四条只是我目前总结菜鸟们在学习FPGA时所最容易跑偏的地
  2. Java -- 获取当前日期、当月月初日期、月末日期
  3. mysql数据库性能优化(包括SQL,表结构,索引,缓存)
  4. ruby api 2.1新增改变
  5. css笔记——关于css中写上charset “utf-8”
  6. c++构造函数详解
  7. Contest20140711 loop 数论
  8. 你需要知道的九大排序算法【Python实现】之归并排序
  9. MongoDB入门(1)--安装配置
  10. 【新特性】JDK10
  11. react-native webView android使用本地html问题
  12. google chrome 浏览器去掉 XHR finished loading....
  13. 【代码笔记】Web-JavaScript-javascript while循环
  14. Springzz中使用监听器,用于容器一启动就加载准备数据(application范围内的数据,用于减轻服务器压力,不用每次都去查数据)
  15. python 类之间的关系
  16. dedecms自增标签[field:global.autoindex/]的运用
  17. PHPExcel 基本用法详解
  18. DAY4-Python学习笔记
  19. POJ 3352 Road Construction(边—双连通分量)
  20. Windows 安装 Maven 及 Eclipse 安装Maven插件

热门文章

  1. 【51nod1705】七星剑(成环DP)
  2. Python读取图片,并保存为矩阵
  3. Hadoop集群批量命令执行
  4. 修改android studio中的avd sdk路径、avd sdk找不到的解决方案
  5. java基础面试题:运行时异常与一般异常有何异同?error和exception有什么区别? 请写出你最常见到的5个runtimeexception?
  6. Java传值分析
  7. PAT 乙级 1059
  8. php扩展开发-变量
  9. 初学js之多组图片切换实例
  10. 用iTerm快速链接远程服务器