线性代数+分治:446E

news/2024/7/5 2:48:43

https://codeforces.com/problemset/problem/446/E

把官方题解翻译了一遍

考虑暴力,肯定想到dp,然后变成矩阵。设在这里插入图片描述在这里插入图片描述代替在这里插入图片描述
(这样子数之间的差值不会变化,但对于问题的处理能方便很多)

我们先令(也就是初始时的方案数)在这里插入图片描述,然后尝试构造转移矩阵 B B B

B B B 的大小应该为 n × n n\times n n×n,每个格子对应两点之间的路径条数,也就是

在这里插入图片描述

我们要算 t t t 填后的 B B B,也就是 B t B^t Bt

所以答案为在这里插入图片描述

考虑如何不暴力地构造 B B B。由于 B B B 非常大,所以我们考虑分治构造+构造过程中乘到 A A A 上面。

先打表 m = 3 m=3 m=3 时的 B 3 B_3 B3

在这里插入图片描述

然后可以观察到一些规律:

在这里插入图片描述

我们可以发现 B B B 之间的类似递推的构造方式:

在这里插入图片描述
其中 在这里插入图片描述

发现其实可以递归下去,所以本质上,其必然可以表示成只存在 B 0 B_0 B0 I I I 的形式:

在这里插入图片描述

我们刚刚提到要求 B B B 的过程中在线维护 A A A

但是观察上面的式子。 A A A 乘上一个矩阵的多次幂难以拆开,所以我们可以考虑把 t t t 放到矩阵每一项上

但是我们直接乘到每一项上对于结果的求解似乎在时间上也无法进行优化。所以我们应该构造一个矩阵,满足其适用于递归进入子问题。

考虑这样子构造:

在这里插入图片描述
这样子构造,我们要求的是 在这里插入图片描述在这里插入图片描述

后面的明显可以在线求,前面的考虑递归

我们要对 A A A 进行分治。那么只有前半部分和后半部分有用,内部具体是什么在当层分治节点并不重要,所以我们设目前 A = A= A=在这里插入图片描述

然后我们乘一下上面的矩阵试试:

在这里插入图片描述
看起来很有用。拿现在考虑递归求解 在这里插入图片描述时,我们还要考虑外面对这里的影响,所以我们必须考虑推广到:

在这里插入图片描述

注意,我们现在其实是用 在这里插入图片描述表示 B m t B_m^t Bmt

所以考虑把上式换成用过 B k B_k Bk 表示的形式,我们按照之前的式子展开:

在这里插入图片描述

可以发现,我们现在已经消除到 B k + 1 B_{k+1} Bk+1,变成了纯用 B k B_k Bk 表示的式子了

把同类型划出来:

在这里插入图片描述
黄色部分可以直接求解,对于在这里插入图片描述我们则进行递归求解

#include<bits/stdc++.h>
using namespace std;
#define int long long
inline int read(){int x=0,f=1;char ch=getchar(); while(ch<'0'||
ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){
x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}return x*f;}
#define Z(x) (x)*(x)
#define pb push_back
//mt19937 rand(time(0));
//mt19937_64 rand(time(0));
//srand(time(0));
#define N 40000010
//#define M
#define mo 1051131
int pw(int a, int b) {
	int ans=1; 
	while(b) {
		if(b&1) ans*=a; 
		a*=a; b>>=1; 
		ans%=mo; a%=mo; 
	}
	return ans; 
}
const int iv2=525566; 
int n, m, i, j, k, T;
int ans, s, t, a[N]; 

void solve(int k, int p, int q) { //计算k,则应由k-1转移过来 
//	printf("[%lld] %lld %lld\n", k, p, q); 
	if(!k) return a[0]=a[0]*pw(p+q, t)%mo, void(); 
	//B0=1=I, so A=(A*B0')^t=(A*B0^(p+q))^t
	int tw=(1ll<<k-1), i, x, y, G=pw(-(1ll<<k-1)*p+p+q, t)%mo; 
//	printf(">> %lld %lld\n", tw, G); 
	for(i=0; i<(1<<k-1); ++i) {
		x=a[i]; y=a[i+tw]; 
		a[i]=(x+y)%mo; //低位拿下去分治 
		a[i+tw]=(x-y)*G%mo; //(a1-a2)*(-2^k*p+p+q)
	}
	solve(k-1, 2*p%mo, ((1ll<<k-1)*p-p+q)%mo); 
	for(i=0; i<(1<<k-1); ++i) {
		x=a[i]; y=a[i+tw]; 
		a[i]=(x+y)*iv2%mo; //代公式 
		a[i+tw]=(x-y)*iv2%mo; 
	}
}

signed main()
{
//	freopen("in.txt", "r", stdin);
//	freopen("out.txt", "w", stdout);
//	T=read();
//	while(T--) {
//
//	}
//	printf(">> %lld %lld\n", iv2, iv2*2%mo); 
	m=read(); t=read(); s=read(); 
	n=(1ll<<m); 
	for(i=1; i<=s; ++i) a[i]=read(); 
	for(; i<=n; ++i) a[i]=(101*a[i-s]+10007)%mo; 
	a[0]=a[n]; 
//	for(i=0; i<n; ++i) printf("%lld ", a[i]); printf("\n"); 
	solve(m, 1, 0); // 初始ans=A*Bm (=1*Bm+0*I) 
	for(i=0; i<n; ++i) ans^=((a[i]%mo+mo)%mo); 
	printf("%lld", ans); 
	return 0;
}



http://lihuaxi.xjx100.cn/news/1576383.html

相关文章

【RK3588】Firefly 瑞芯微板子入门知识、和环境篇

公司买了块瑞芯微的移动开发板&#xff0c;准备将公司的主营业务的AI模型&#xff0c;从服务器主机&#xff0c;移动到开发板上面。所以&#xff0c;就选择了瑞芯微的RK3588的板子。 从目前市面上出现的板子来看&#xff0c;主要的还是以瑞芯微的板子为主&#xff0c;比如鸣辰…

生信教程:使用全基因组SNP数据进行ABBA-BABA分析

动动发财的小手&#xff0c;点个赞吧&#xff01; 简介 ABBA BABA 统计&#xff08;也称为“D 统计”&#xff09;为偏离严格的分叉进化历史提供了简单而有力的测试。因此&#xff0c;它们经常用于使用基因组规模的 SNP 数据&#xff08;例如来自全基因组测序或 RADseq&#xf…

深度分页优化

在我理解中深度分页的解决方案有两种?其实没有什么完美的方案&#xff0c;根据具体场景选择合适的即可 1.游标查询&#xff0c;请移步到我的文章游标查询的使用场景-CSDN博客 2.覆盖索引子查询 就是先分页查询出主键id&#xff0c;然后再in(id)即可 select *from student …

国密国际SSL双证书解决方案,满足企事业单位国产国密SSL证书要求

近年来&#xff0c;为了摆脱对国外技术和产品的依赖&#xff0c;建设安全的网络环境&#xff0c;以及加强我国对网络信息的安全可控能力&#xff0c;我国推出了国密算法。同时&#xff0c;为保护网络通信信息安全&#xff0c;更高级别的安全加密数字证书—国密SSL证书应运而生。…

Vue3最佳实践 第五章 Vue 组件应用 2 ( Emit )

本章带领大家理解组件、props、emits、slots、providers/injects&#xff0c;Vue 插件 等Vue组件使用的基础知识。 第一章 Vue3项目创建 1 Vue CLI 创建vue项目 第一章 Vue3项目创建 2 使用 Webpack 5 搭建 vue项目 第一章 Vue3项目创建 3 Vite 创建 vue项目 第二章 Vue3 基础语…

求二分图的最大匹配(匈牙利算法)

861. 二分图的最大匹配 - AcWing题库 AC代码&#xff1a; #include <iostream> #include <cstring> #include <algorithm>using namespace std;const int N 510,M 100010; int n1,n2,m; int h[N],e[M],ne[M],idx; int match[N]; bool st[N];void add(int…

tailwind使用教程以及tailwind不生效的问题

以Vite项目为例 我们先安装依赖文件 生成文件 yarn add -D tailwindcss postcss autoprefixer npx tailwindcss init -p配置tailwind.config.js文件 /** type {import(tailwindcss).Config} */ export default {content: ["./index.html","./src/**/*.{vue,j…

学信息系统项目管理师第4版系列12_合同管理

1. 项目范围划分 1.1. 项目总承包合同 1.1.1. 总承包合同要求只与同一个卖方订立承包合同 1.1.2. 不意味着只订立一个总合同 1.2. 项目单项承包合同 1.2.1. 买方分别与不同的卖方订立项目单项承包合同 1.3. 项目分包合同 1.3.1. 满足5个条件 1.3.1.1. ①经过买方认可 …