BZOJ3329 Xorequ(数位DP)
题目大意:x xor 2x=3x(与x xor 3x=2x等价)求满足等式且小于n的x的个数,与满足等式小于2n的数的个数。
因为异或是不进位的二进制加法,那么因为结果正好和加法相同,那么说明x在二进制上没有相邻的1。那么简单的数位DP就可以求出满足这个的答案了。
再看subtask2,根据打表找规律可得,这就是斐波那契数列的第n+2项(以首项是0来说)。那么只需要O(23⋅lgn)的矩阵乘法就可以了。
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define LL long long unsigned
const LL MOD = 1e9+7;
LL dp[100][2], L, R, cnt;
int n, a[100];
LL DP(int i, int j, int f) {
if(!i) return 1;
if(!f && ~dp[i][j]) return dp[i][j];
LL ans = 0;
int ed = f ? a[i] : 1;
for(int k = 0; k <= ed; ++ k) if(!k||!j) ans += DP(i-1, k, f && k == ed);
if(!f) dp[i][j] = ans;
return ans;
}
LL solve(LL s, int len = 0) {
for(; s; s >>= 1) a[++ len] = s & 1;
return DP(len, 0, 1);
}
struct Mat { LL a[3][3]; } A, B;
Mat Mul(Mat A, Mat B) {
Mat C;
for(int i = 0; i < 2; ++ i)
for(int j = 0; j < 2; ++ j)
C.a[i][j] = 0;
for(int i = 0; i < 2; ++ i)
for(int j = 0; j < 2; ++ j)
for(int k = 0; k < 2; ++ k)
C.a[i][j] = (C.a[i][j] + A.a[i][k] * B.a[k][j]) % MOD;
return C;
}
Mat ksm(Mat A, LL k) {
Mat C;
for(int i = 0; i < 2; ++ i)
for(int j = 0; j < 2; ++ j)
C.a[i][j] = (i == j);
for(; k; k >>= 1) {
if(k & 1) C = Mul(C, A);
A = Mul(A, A);
}
return C;
}
int main() {
memset(dp, -1, sizeof dp);
int T; scanf("%d", &T);
while(T --) {
scanf("%llu", &R);
A.a[0][0] = A.a[0][1] = A.a[1][0] = 1;
A.a[1][1] = 0;
B.a[0][1] = 0; B.a[0][0] = 1;
A = ksm(A, R+1); A = Mul(A, B);
printf("%llu\n%llu\n", solve(R)-1, A.a[0][0]);
}
}
BZOJ3329 Xorequ(数位DP)的更多相关文章
- BZOJ3329 Xorequ[数位DP+递推矩阵快速幂]
数 位 D P 开 long long 首先第一问是转化. 于是就可以二进制下DP了. 第二问是递推,假设最后$n-1$个01位的填法设为$f[i-1]$(方案包括 ...
- 【bzoj3329】Xorequ 数位dp+矩阵乘法
题目描述 输入 第一行一个正整数,表示数据组数据 ,接下来T行每行一个正整数N 输出 2*T行第2*i-1行表示第i个数据中问题一的解, 第2*i行表示第i个数据中问题二的解, 样例输入 1 1 样例 ...
- 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)
题目链接 x^3x=2x -> x^2x=3x 因为a^b+((a&b)<<1)=a+b,x^2x=x+2x,所以x和2x的二进制表示中不存在相邻的1. (或者,因为x+2x ...
- BZOJ 3329 - Xorequ - 数位DP, 矩乘
Solution 发现 $x \ xor \ 2x = 3x$ 仅当 $x$ 的二进制中没有相邻的 $1$ 对于第一个问题就可以进行数位DP 了. 但是对于第二个问题, 我们只能通过递推 打表 来算 ...
- BZOJ 3329 Xorequ (数位DP、矩阵乘法)
手动博客搬家: 本文发表于20181105 23:18:54, 原地址https://blog.csdn.net/suncongbo/article/details/83758728 题目链接 htt ...
- BZOJ 3329: Xorequ(数位dp+递推)
传送门 解题思路 可以把原式移项得\(x\)^\(2x\)=\(3x\),而\(x+2x=3x\),说明\(x\)二进制下不能有两个连续的\(1\).那么第一问就是一个简单的数位\(dp\),第二问考 ...
- 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 ...
随机推荐
- IMX6下移植WKxxx驱动
wkXXX.c #include<linux/init.h> #include <linux/module.h> #include <linux/kernel.h> ...
- 第五百七十七天 how can I 坚持
今天看了个电影<七月与安生>,挺不错,周冬雨,马思纯,然后就突然有了个想法,过年不回家了,去趟拉萨,或许只是想想吧,不知道有没有勇气去啊,何况是自己一个人,但是又想,旅行要是没点冒险的话, ...
- VC++ list函数详解
在使用之前,需要完成两件事: (1) #include <list> (2) using namespace std; 声名变量: list<int> intlist ...
- Ruby-打包程序
1.下载 ocra-1.3.1.gem 文件 2.打开“start Command prompt with ruby” 命令窗口 3.输入 “gem install e:\ocra-1.3.1.ge ...
- 在Mac上安装IntelliJ IDEA
这篇文章旨在介绍如何在Mac系统上安装IntelliJ IDEA,至于IntelliJ IDEA的介绍和使用方法,大家另行查阅,本篇的文章不再详细阐述. 简短解说,IntelliJ IDEA是可以用来 ...
- ASP.NET ZERO 学习 JTable的使用子表闭合功能
双击子表自动判定开闭功能 //CHILD TABLE DEFINITION FOR "PHONE NUMBERS" Phones: { title: '', width: '5%' ...
- C# conn.open() 外部表不是预期的格式( 读取EXCEL文件出错)
环境:win7+iis7+Office2007 在asp.net网站中导出Excel文件后,再把文件导入到数据库中. 读取Excel文件时,打开连接出错. 错误为:外部表不是预期的格式 解决:检查了一 ...
- Java核心知识点学习----多线程并发之线程间的通信,notify,wait
1.需求: 子线程循环10次,主线程循环100次,这样间隔循环50次. 2.实现: package com.amos.concurrent; /** * @ClassName: ThreadSynch ...
- 【html/css】html/css命名规范
无论做什么,规则总是最重要的.无规矩不成方圆,有了规矩,我们才能有规可循,有则可依,人与人之间才能正常的交流交往. 人人都有自己的命名习惯,不过,代码是需要交流的,当有些命名习惯仅只自己能看懂,甚至自 ...
- zend 汉化
http://jingyan.baidu.com/article/4f34706ecdb566e387b56d05.html