BZOJ 3329: Xorequ(数位dp+递推)
解题思路
可以把原式移项得\(x\)^\(2x\)=\(3x\),而\(x+2x=3x\),说明\(x\)二进制下不能有两个连续的\(1\)。那么第一问就是一个简单的数位\(dp\),第二问考虑递推按位做,设\(f(i)\)表示最后一位为\(0\)的答案,\(g(i)\)表示最后一位为\(1\)的答案,那么\(f(i)=g(i-1)+f(i-1)\),\(g(i)=f(i-1)\),整理一下发现\(f(i)=f(i-1)+f(i-2)\),就是斐波那契的形式,直接矩乘即可。
代码
#include<bits/stdc++.h>
using namespace std;
const int N=70;
const int MOD=1e9+7;
typedef long long LL;
int a[N],len;
LL f[N][2][2],n;
bool vis[N][2][2];
LL DFS(int x,int lst,int lim){
if(vis[x][lst][lim]) return f[x][lst][lim];
vis[x][lst][lim]=1;
if(!x) return f[x][lst][lim]=1;
if(!lst && (lim || a[x])) f[x][lst][lim]=DFS(x-1,1,lim);
f[x][lst][lim]+=DFS(x-1,0,lim|(a[x]==1));
return f[x][lst][lim];
}
struct Matrix{
int a[3][3];
void clear(){
memset(a,0,sizeof(a));
}
void init(){
a[1][1]=a[2][2]=1;
}
friend Matrix operator*(const Matrix A,const Matrix B){
Matrix ret; ret.clear();
for(int i=1;i<=2;i++)
for(int j=1;j<=2;j++)
for(int k=1;k<=2;k++)
(ret.a[i][j]+=1ll*A.a[i][k]*B.a[k][j]%MOD)%=MOD;
return ret;
}
}mat,ans;
Matrix fast_pow(Matrix x,LL y){
Matrix ret; ret.clear(); ret.init();
for(;y;y>>=1){
if(y&1) ret=ret*x;
x=x*x;
}
return ret;
}
int main(){
int T; scanf("%d",&T);
while(T--){
memset(vis,false,sizeof(vis));
memset(f,0,sizeof(f));
scanf("%lld",&n); LL nn=n;
len=0;
while(n) a[++len]=(n&1),n>>=1;
printf("%lld\n",DFS(len,0,0)-1);
// cerr<<"!!!"<<endl;
if(nn==1) puts("2");
else if(nn==2) puts("3");
else {
// cerr<<"!!!"<<endl;
ans.clear(); mat.clear();
ans.a[1][1]=2; ans.a[1][2]=3;
mat.a[1][2]=mat.a[2][2]=mat.a[2][1]=1;
ans=ans*fast_pow(mat,nn-2);
printf("%d\n",ans.a[1][2]);
}
}
return 0;
}
BZOJ 3329: Xorequ(数位dp+递推)的更多相关文章
- BZOJ 3329 Xorequ (数位DP、矩阵乘法)
手动博客搬家: 本文发表于20181105 23:18:54, 原地址https://blog.csdn.net/suncongbo/article/details/83758728 题目链接 htt ...
- 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, 矩乘
Solution 发现 $x \ xor \ 2x = 3x$ 仅当 $x$ 的二进制中没有相邻的 $1$ 对于第一个问题就可以进行数位DP 了. 但是对于第二个问题, 我们只能通过递推 打表 来算 ...
- BZOJ3329 Xorequ[数位DP+递推矩阵快速幂]
数 位 D P 开 long long 首先第一问是转化. 于是就可以二进制下DP了. 第二问是递推,假设最后$n-1$个01位的填法设为$f[i-1]$(方案包括 ...
- 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 ...
- hdu2089(数位DP 递推形式)
不要62 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- 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 ...
- 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,根据上面的 ...
- hdu 2604 Queuing(dp递推)
昨晚搞的第二道矩阵快速幂,一开始我还想直接套个矩阵上去(原谅哥模板题做多了),后来看清楚题意后觉得有点像之前做的数位dp的水题,于是就用数位dp的方法去分析,推了好一会总算推出它的递推关系式了(还是菜 ...
随机推荐
- 20191110 Spring Boot官方文档学习(3)
3.使用Spring Boot 3.1.构建系统 建议选择Maven或Gradle作为构建工具 每个Spring Boot版本都提供了它所支持的依赖关系的精选列表.实际上,您不需要为构建配置中的所有这 ...
- python 并发编程 多进程 目录
python multiprocessing模块 介绍 python 开启进程两种方法 python 并发编程 查看进程的id pid与父进程id ppid python 并发编程 多进程 Proce ...
- Linear Discriminant Analysis
Suppose that we model each class density as multivariate Gaussian, in practice we do not know the pa ...
- [LeetCode] 82. 删除排序链表中的重复元素 II
题目链接 : https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list-ii/ 题目描述: 给定一个排序链表,删除所有含有 ...
- 搜索专题: HDU1312Red and Black
Red and Black Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) To ...
- HDU1688-POJ3463-Sightseeing(求次短路的条数)
题意 求出最短路和次短路的条数,当次短路比最短路长度小1时,输出条数之和,反之输出最短路条数. 题解 dis1[],cnt1[],dis2[],cnt2[] 分别表示最短路的长度和条数,次短路的长度 ...
- http协议是无状态协议,它的无状态指的是什么,如何解决这种情况
http是无状态的协议,也是不安全的协议, 它的无状态是指对于事务处理没有记忆能力,缺少状态意味着后续的操作需要前面的信息. 解决办法:1,通过cookie解决,2,通过session会话保存.
- C# 同比缩放图片
/** * 无损缩放图片 * bitmap 需要缩放的图片 * w 需要缩放的宽度 * h 需要缩放的高度 * */ public static System.Drawing.Bitmap TBSca ...
- Apache 的 bin 目录文件详解
[root@Apache bin]# tree ├── ab #Apache 性能测试工具 ├── apachectl #Apache 启动命令,它是一个脚本 ├── apr-1-conf ...
- 关于prepareStatement(String sql,int autoGeneratedKeys)的记录
PreparedStatement prepareStatement(String sql,int autoGeneratedKeys) throws SQLException autoGenerat ...