Description

题库链接

给出 \(n\) ,分别求 \(\leq n\) 和 \(\leq 2^n\) 的满足方程 \[x\oplus 3x=2x\] 的正整数解个数。

\(1\leq n\leq 10^{18}\)

Solution

显然满足 \(x\oplus 2x=3x\) 即要满足 \(x\&(x<<1)=0\) 。其含义就是数的二进制相邻的两位不能同为 \(1\) 。

考虑第一种情况,即 \(\leq n\) 。容易发现其实可以数位 \(DP\) 。 \(f_{i,1/0}\) 为 \(i\) 位二进制的最高位为 \(1/0\) 的满足条件的非负整数的个数。

\[\begin{aligned}f_{i,0}&=f_{i-1,1}+f_{i-1,0}\\f_{i,1}&=f_{i-1,0}\end{aligned}\]

然后按位计算即可。

对于 \(\leq 2^n\) 的情况,容易发现其对具体的某一位是没有约束的,直接用矩阵加速上述转移方程即可。

Code

#include <bits/stdc++.h>
using namespace std;
const int yzh = 1e9+7; long long f[100][2], n;
int t;
struct mat {
int a[2][2];
mat () {a[0][0] = a[0][1] = a[1][0] = a[1][1] = 0; }
mat operator * (const mat &b) const {
mat ans;
for (int i = 0; i < 2; i++)
for (int j = 0; j < 2; j++)
for (int k = 0; k < 2; k++)
(ans.a[i][j] += 1ll*a[i][k]*b.a[k][j]%yzh) %= yzh;
return ans;
}
}S, T; mat quick_pow(mat S, mat T, long long t) {
while (t) {
if (t&1) S = S*T;
t >>= 1, T = T*T;
}
return S;
}
void pre() {
f[0][0] = f[0][1] = 1;
for (int i = 1; i <= 90; i++)
f[i][0] = f[i-1][0]+f[i-1][1], f[i][1] = f[i-1][0];
}
long long get_ans1(long long x) {
int a[100], tot = -1; long long ans = 0;
while (x) a[++tot] = x%2, x /= 2; a[tot+1] = 0;
for (int i = tot; i >= 0; i--) {
if (a[i] == 1) ans += f[i][0];
if (a[i] == 1 && a[i+1] == 1) break;
if (i == 0) ++ans;
}
return ans-1;
}
int get_ans2(long long x) {
S.a[0][0] = S.a[0][1] = 1;
T.a[0][0] = T.a[1][0] = T.a[0][1] = 1; T.a[1][1] = 0;
S = quick_pow(S, T, x-1);
return S.a[0][0]+S.a[0][1];
}
void work() {
pre(); scanf("%d", &t);
while (t--) {
scanf("%lld", &n);
printf("%lld\n%d\n", get_ans1(n), get_ans2(n)%yzh);
}
}
int main() {work(); return 0; }

[BZOJ 3329]Xorequ的更多相关文章

  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、矩阵乘法)

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

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

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

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

  5. BZOJ 3329 Xorequ:数位dp + 矩阵快速幂

    传送门 题意 现有如下方程:$ x \oplus 3x = 2x $ 其中 $ \oplus $ 表示按位异或. 共 $ T $ 组数据,每组数据给定正整数 $ n $,任务如下: 求出小于等于 $ ...

  6. 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,根据上面的 ...

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

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

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

  9. 3329: Xorequ

    3329: Xorequ https://www.lydsy.com/JudgeOnline/problem.php?id=3329 分析: 因为a+b = a^b + ((a&b)<& ...

随机推荐

  1. 走进webpack(3)-- 小结

    写这一系列的文章,本意是想要梳理一下自己凌乱的webpack知识,只是使用过vue-cli,修改过其中的一部分代码,但是对于一个简单项目从0开始搭建webpack的流程和其中的依赖并不是十分清楚.所以 ...

  2. Java基础学习笔记二 Java基础语法

    注释 注释用来解释和说明程序的文字,注释是不会被执行的. 单行注释 //这是一条单行注释 public int i; 多行注释 /* 这是 * 一段注释, * 它跨越了多个行 */ public vo ...

  3. eclipse如何debug调试jdk源码(任何源码)并显示局部变量

    最近要看struts2源码 仿照了一下查看jdk源码的方式 首先你要有strtus2的jar包和源码,在struts官网上下载时,选择full版本,里面会有src也就是源码了. jar导入项目,保证可 ...

  4. Beta冲刺合集

    Beta冲刺序列: Beta凡事预则立 :Beta No.0 Beta冲刺Day1:Beta No.1 Beta冲刺Day2:Beta No.2 Beta冲刺Day3:Beta No.3 Beta冲刺 ...

  5. 网络1712--c语言函数作业总结

    作业亮点 1.总体情况 很多同学在思路方面大部分写的都很详细,能够通过思路回顾自己的代码 大部分同学都认真完成PTA,也充分利用了函数来解题 大部分同学能够从上机考试中总结自己的失误和不足点,制订了自 ...

  6. 数字是否可以被3和5同时整除,use if and % (21.9.2017)

    #include <stdio.h> int main(){ int a; //a是所输入的数字 printf("输入数字: "); scanf("%d&qu ...

  7. Django 视图层

    URL映射 1.分布式url映射 include()函数提供分布式url映射功能,使URL映射可以被编写在多个url.py文件中 from django.conf.urls import url fr ...

  8. android批量打包

    http://blog.csdn.net/johnny901114/article/details/48714849

  9. html{font-size:62.5%}

    为什么要使用html,body{font-size:62.5%}? 使用以下代码查看浏览器的初始font-size: <!DOCTYPE html><html><head ...

  10. WPF 自定义Calendar样式(日历样式,周六周日红色显示)

    一.WPF日历控件基本样式 通过Blend获取到Calendar需要设置的三个样式CalendarStyle.CalendarButtonStyle.CalendarDayButtonStyle.Ca ...