Solution -「校内题」Xorequ
0x00 前置芝士
数位dp考试里出现的小神题??
显然考场会选择打表找规律。
数位dp + 矩阵快速幂
0x01 题目描述
给定正整数 \(n\),现有如下方程 \(x \bigoplus 3x = 2x\),其中 \(\bigoplus\) 表示按位异或。
任务如下:
- 求出小于等于 \(n\) 的正整数中,有多少个数是该方程的解
- 求出小于等于 \(2^n\) 的正整数中,有多少个数是该方程的解,答案对 \(10^9 + 7\) 取模
0x02 分析
第一问
试证明满足 \(x \bigoplus 2 \times x = 3 \times x\) 的 \(x\),二进制拆分数列里没有相邻的 \(1\)。
条件可化为 \(x \bigoplus 2 \times x = x + 2 \times x\)。
若有相邻的 \(1\),二倍后即错位相加,定会产生多余进位,得不到右边的答案,故矛盾。故原命题成立。
例:
0 0 1 1
0 1 1 0
推论: 设 \(f(a, b)(b \in \{0, 1\})\) 表示第 \(a - 1\) 一位为 \(b\) 的数中共有多少个满足条件的数。
则 \(f(a, 0) = f(a - 1, 1) + f(a - 2, 0)\),\(f(a, 1) = f(a - 1, 0)\)。证明显然。
第二问
试证明小于 \(2 ^ n\) 的满足 \(x \bigoplus 2 \times x = 3 \times x\) 的 \(x\) 的个数为斐波那契数列第 \(n\) 项。
记 \(g(a) = f(a, 0) + f(a, 1)\)。利用第一问结论推论,推导如下。
\(g(a) = f(a, 0) + f(a, 1)\)
\(g(a) = f(a - 1, 1) + f(a - 1, 0) + f(a - 1, 0)\)
\(g(a) = g(a - 1) + f(a - 2, 1) + f(a - 2, 0)\)
\(g(a) = g(a - 1) + g(a - 2)\)
0x04 具体实现
#include <cstdio>
#include <cstring>
using namespace std;
typedef long long LL;
const int MAXL = 105;
const int MAXN = 4;
const int mod = 1e9 + 7;
int flag[MAXL], a[MAXL];
LL dp[MAXL][MAXL][2][2];
struct Matrix {
    int n, m;
    LL mp[MAXN][MAXN];
    Matrix() { memset(mp, 0, sizeof mp); }
    Matrix operator * (const Matrix &x) const {
        Matrix ans;
        ans.n = n;
        ans.m = x.m;
        for (int i = 1; i <= ans.n; i++)
            for (int j = 1; j <= ans.m; j++)
                for (int k = 1; k <= m; k++)
                    ans.mp[i][j] = (ans.mp[i][j] + (mp[i][k] * x.mp[k][j]) % mod) % mod;
        return ans;
    }
};
Matrix Quick_pow(Matrix a, LL x) {
    Matrix ans;
    ans.n = 2;
    ans.m = 2;
    ans.mp[2][2] = 1;
    ans.mp[1][1] = 1;
    ans.mp[1][2] = 0;
    ans.mp[2][1] = 0;
    while (x) {
        if (x & 1)
            ans = ans * a;
        a = a * a;
        x >>= 1;
    }
    return ans;
}
LL dfs(int p, int last, bool k, bool limit, bool t) {
	if(p <= 0)
		return !t && k;
	if(!limit && dp[p][last][t][k] != -1)
		return dp[p][last][t][k];
	int up = limit ? flag[p] : 1;
	LL ans = 0;
	for(int i = 0; i <= up; i++)
		ans = (ans + dfs(p - 1, i, t || last == -1 || (k && i == 1 && last == 0)
		|| (k && i == 0 && last == 0) || (k && i == 0 && last == 1), limit && (i == up), (t && !i)));
	if(!limit)
		dp[p][last][t][k] = ans;
	return ans;
}
LL Query(LL x) {
	int len = 0;
	while(x) {
		flag[++len] = (x & 1);
		x >>= 1;
	}
	return dfs(len, -1, true, true, true);
}
int main() {
	memset(dp, -1, sizeof dp);
	int T;
	scanf ("%d", &T);
	while(T--) {
		LL n;
		scanf ("%lld", &n);
		printf("%lld\n", Query(n));
		Matrix A, cur, ans;
		A.n = 2, A.m = 2;
		A.mp[1][1] = 0;
		A.mp[1][2] = 1;
		A.mp[2][1] = 1;
		A.mp[2][2] = 1;
		ans = Quick_pow(A, n);
		cur.n = 1, cur.m = 2;
		cur.mp[1][1] = 1;
		cur.mp[1][2] = 1;
		ans = cur * ans;
		printf("%lld\n", ans.mp[1][2] % mod);
	}
	return 0;
}
Solution -「校内题」Xorequ的更多相关文章
- Solution -「校内题」矩阵求和
		Description 共 \(T\) 组数据.对于每组数据,给定 \(a, b, n\),求 \(\sum_{i = 1}^{n} \sum_{j = 1}^{n} \gcd(a^i - b^i, ... 
- Solution -「ARC 104E」Random LIS
		\(\mathcal{Description}\) Link. 给定整数序列 \(\{a_n\}\),对于整数序列 \(\{b_n\}\),\(b_i\) 在 \([1,a_i]\) 中等概率 ... 
- Solution -「ARC 101D」「AT4353」Robots and Exits
		\(\mathcal{Description}\) Link. 有 \(n\) 个小球,坐标为 \(x_{1..n}\):还有 \(m\) 个洞,坐标为 \(y_{1..m}\),保证上述坐标 ... 
- Solution -「国家集训队」「洛谷 P2619」Tree I
		\(\mathcal{Description}\) Link. 给一个 \(n\) 个点 \(m\) 条边的带权无向图,边有权值和黑白颜色,求恰选出 \(K\) 条白边构成的最小生成树. ... 
- Solution -「ARC 104C」Fair Elevator
		\(\mathcal{Description}\) Link. 数轴从 \(1\sim 2n\) 的整点上有 \(n\) 个闭区间.你只知道每个区间的部分信息(可能不知道左或右端点,或者都不知 ... 
- Solution -「基环树」做题记录
		写的大多只是思路,比较简单的细节和证明过程就不放了,有需者自取. 基环树简介 简单说一说基环树吧.由名字扩展可得这是一类以环为基础的树(当然显然它不是树. 通常的表现形式是一棵树再加一条非树边,把图画 ... 
- Solution -「CF 1342E」Placing Rooks
		\(\mathcal{Description}\) Link. 在一个 \(n\times n\) 的国际象棋棋盘上摆 \(n\) 个车,求满足: 所有格子都可以被攻击到. 恰好存在 \(k\ ... 
- Solution -「CTS 2019」「洛谷 P5404」氪金手游
		\(\mathcal{Description}\) Link. 有 \(n\) 张卡牌,第 \(i\) 张的权值 \(w_i\in\{1,2,3\}\),且取值为 \(k\) 的概率正比于 \ ... 
- Solution -「BZOJ 3812」主旋律
		\(\mathcal{Description}\) Link. 给定含 \(n\) 个点 \(m\) 条边的简单有向图 \(G=(V,E)\),求 \(H=(V,E'\subseteq E)\ ... 
随机推荐
- Pytorch Linear ()简单推导
			pytorch,nn.Linear 下图中的A是权重矩阵,b是偏置. in_features输入样本的张量大小 out_features输出样本的张量大小 bias是偏置 # 测试代码 # batch ... 
- viewport布局
			1.viewport实例 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <h ... 
- SpringBoot从Eclipse添加的Tomcat容器中启动
			SpringBoot的Web项目,想要在Eclipse中的Tomcat容器中启动运行需要做下面这两处改动 pom.xml <packaging>war</packaging> ... 
- 129_Power Pivot&Power BI DAX不同维度动态展示&动态坐标轴
			博客:www.jiaopengzi.com 焦棚子的文章目录 请点击下载附件 一.背景 某天在和那还是叫我大铁吧 交流关于季度&月度同时展示的问题,感概中国式报表真的需求很微妙. 下面来看看到 ... 
- 「POI2012」井 Well
			description 你要挖井,\(n\)个地面的高度可视为\(h_i\),每次操作你可以将一个\(h_i-1\),你最多可执行\(m\)次操作. 你要任选其中一个\(h_i\)挖到\(0\),问你 ... 
- 12.MYSQL基础-常见函数
			4. 常见函数 一.字符函数 概念 类似于Java的方法,将一组逻辑语句封装在方法中,对外暴露方法名 优点 隐藏了实现细节 提高代码的重用性 调用 select 函数名(实参列表) [ from 表] ... 
- Java基本运算
			目录 运算符 运算符优先级 运算 自增(++)自减(--)运算 数学运算(Math类) 逻辑运算 位运算 拓展运算符 三元运算符 视频课程 运算符 Java语言支持如下运算符: 算术运算符: +, - ... 
- 解惑unittest框架中导入HTMLTestRunner模块后正常运行却无法生成HTML报告问题
			1.HTMLTestRunner介绍 HTMLTestRunner是一个第三方的unittest HTML报告库,用于python单元测试框架的TestRunner.它是生成一个HTML报告,以一目了 ... 
- 【生成对抗网络学习 其三】BiGAN论文阅读笔记及其原理理解
			参考资料: 1.https://github.com/dragen1860/TensorFlow-2.x-Tutorials 2.<Adversarial Feature Learning> ... 
- Bika LIMS 开源LIMS集—— SENAITE的安装
			安装环境 操作系统 Ubuntu 18.04 LTS Python 2.x. Plone 4 安装步骤 Ubuntu等Linux.Mac系统一般安装有Python的环境,但由于需要安装Python扩展 ... 
