注意第一问不取模!!!

因为a+b=a|b+a&b,ab=a|b-a&b,所以a+b=ab+2(a&b)

x3x==2x可根据异或的性质以转成x2x==3x,根据上面的推导,得到

x^2x=x+2x-2
(x&2x)3x;

3x-2*(x&2x)3x;

x&2x0;

x&(x<<1)0

也就是说x在二进制下不能有相邻的1

第一问用数位dp瞎搞一下就行

第二问,考虑递推,设f[i]为n==i的答案,已知f[n-1],f[n],求f[n+1],考虑在新增的位置上放0,那么剩下n个位置可以随便放,也就是f[n];在新增的位置上放1,那么n-1位一定要放0,剩下n-1个位置可以随便放,也就是f[n-1],所以f[n+1]=f[n]+f[n-1],就是斐波那契数列,用矩阵乘法加速即可

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int mod=1e9+7;
long long T,n,b[65],tot,x,ha[65][2];
struct qwe
{
long long a[5][5];
void clr()
{
a[1][1]=a[1][2]=a[2][1]=a[2][2]=0;
}
qwe operator * (const qwe &b) const
{
qwe c;
for(int i=1;i<=2;i++)
for(int j=1;j<=2;j++)
{
c.a[i][j]=0;
for(int k=1;k<=2;k++)
c.a[i][j]=(c.a[i][j]+a[i][k]*b.a[k][j])%mod;
}
return c;
}
}aa;
long long dfs(int w,int lm,int la)
{
if(!w)
return 1;
if(!lm&&ha[w][la])
return ha[w][la];
if(lm)
{
if(b[w]==0||la==1)
return dfs(w-1,b[w]==0,0);
else
return dfs(w-1,0,0)+dfs(w-1,1,1);
}
if(la==1)
ha[w][la]=dfs(w-1,0,0);
else
ha[w][la]=dfs(w-1,0,0)+dfs(w-1,0,1);
return ha[w][la];
}
int main()
{
scanf("%lld",&T);
aa.a[1][2]=aa.a[2][1]=aa.a[2][2]=1;
while(T--)
{
memset(b,0,sizeof(b));
memset(ha,0,sizeof(ha));
scanf("%lld",&n);
tot=0;x=n;
while(x)
b[++tot]=x%2,x/=2;
qwe r,a=aa;
r.a[1][1]=r.a[2][2]=1,r.a[1][2]=r.a[2][1]=0;
x=n+1;
while(x)
{
if(x&1)
r=r*a;
a=a*a;
x>>=1;
}
printf("%lld\n%lld\n",dfs(tot,1,0)-1,(r.a[1][1]+r.a[1][2])%mod);
}
return 0;
}

bzoj 3329: Xorequ【数位dp+矩阵乘法】的更多相关文章

  1. BZOJ 3329: Xorequ [数位DP 矩阵乘法]

    3329: Xorequ 题意:\(\le n \le 10^18\)和\(\le 2^n\)中满足\(x\oplus 3x = 2x\)的解的个数,第二问模1e9+7 \(x\oplus 2x = ...

  2. 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 ...

  3. 【bzoj3329】Xorequ 数位dp+矩阵乘法

    题目描述 输入 第一行一个正整数,表示数据组数据 ,接下来T行每行一个正整数N 输出 2*T行第2*i-1行表示第i个数据中问题一的解, 第2*i行表示第i个数据中问题二的解, 样例输入 1 1 样例 ...

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

    手动博客搬家: 本文发表于20181105 23:18:54, 原地址https://blog.csdn.net/suncongbo/article/details/83758728 题目链接 htt ...

  5. BZOJ 3329 - Xorequ - 数位DP, 矩乘

    Solution 发现 $x \ xor \  2x = 3x$ 仅当 $x$ 的二进制中没有相邻的 $1$ 对于第一个问题就可以进行数位DP 了. 但是对于第二个问题, 我们只能通过递推 打表 来算 ...

  6. BZOJ.3329.Xorequ(数位DP)

    题目链接 x^3x=2x -> x^2x=3x 因为a^b+((a&b)<<1)=a+b,x^2x=x+2x,所以x和2x的二进制表示中不存在相邻的1. (或者,因为x+2x ...

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

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

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

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

  9. 【bzoj2004】[Hnoi2010]Bus 公交线路 状压dp+矩阵乘法

    题目描述 小Z所在的城市有N个公交车站,排列在一条长(N-1)km的直线上,从左到右依次编号为1到N,相邻公交车站间的距离均为1km. 作为公交车线路的规划者,小Z调查了市民的需求,决定按下述规则设计 ...

随机推荐

  1. FastDFS+nginx+php的完整应用[转储]

    FastDFS功能简介: FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储.文件同步.文件访问(文件上传.文件下载)等,解决了大容量存储和负载均衡的问题.特别适合以 ...

  2. nagios+logstash实时监控java日志(一)

    https://blog.csdn.net/yanggd1987/article/details/64121459

  3. SOJ 4482 忽悠大神【最小生成树】

    题目链接: http://acm.scu.edu.cn/soj/problem.action?id=4482 题意: 给定边权和点权,从一个点出发并回到该点,减少尽量多的边,每路过点和边都要把权重加到 ...

  4. IP聚合 ---百度之星(与运算)

    Problem Description 当今世界,网络已经无处不在了,小度熊由于犯了错误,当上了度度公司的网络管理员,他手上有大量的 IP列表,小度熊想知道在某个固定的子网掩码下,有多少个网络地址.网 ...

  5. [Bzoj1030][JSOI2007]文本生成器(AC自动机)(dp)

    1030: [JSOI2007]文本生成器 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 5254  Solved: 2172[Submit][Stat ...

  6. Spoj 3267 DQUERY - D-query

    题目描述 English VietnameseGiven a sequence of n numbers a _{1}1​ , a _{2}2​ , ..., a _{n}n​ and a numbe ...

  7. SpringMVC Ueditor1.4.3 未找到上传数据

    ueditor自事的fileupload组件与spring的有冲突.将那个类BinaryUploader 重写就可以了             return storageState;         ...

  8. 关于maven的规则插件:Maven Enforcer plugin

    Maven提供了Maven-Enforcer-Plugin插件,用来校验约定遵守情况(或者说校验开发环境).比如JDK的版本,Maven的版本,开发环境(Linux,Windows等),依赖jar包的 ...

  9. 原来,表名和字段名不能在pdo中“参数化查询”

    https://stackoverflow.com/questions/182287/can-php-pdo-statements-accept-the-table-or-column-name-as ...

  10. 去掉小程序textarea上的完成按钮栏

    小程序textarea上会自动多一个完成按钮,如下图所示,如果是mpVue,在textarea添加     :show-confirm-bar="false"     即可.