线性代数+分治:446E

news2024/11/29 18:42:57

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://www.coloradmin.cn/o/1055144.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++ 并发编程实战 第八章 设计并发代码 一

目录 8.1 在线程间切分任务 8.1.1 先在线程间切分数据&#xff0c;再开始处理 8.1.2 以递归方式划分数据 8.1.3 依据工作类别划分任务 借多线程分离关注点需防范两大风险 在线程间按流程划分任务 8.2 影响并发性能的因素 8.2.1 处理器的数量 8.2.2 数据竞争和缓存兵乓…

蓝桥等考Python组别九级005

第一部分&#xff1a;选择题 1、Python L9 &#xff08;15分&#xff09; 运行下面程序&#xff0c;可以输出几行“*”&#xff1f;&#xff08; &#xff09; for i in range(0, 2): for j in range(0, 5): print(*, end ) print() 5234 正确答案&#xff1a;B 2、P…

瑞云介绍使用ZBrush和Marmoset工具包制作的风格化巨怪战斗机

Renderbus瑞云渲染的小编今天给大家介绍下Gianluca Squillace使用 ZBrush 和 Marmoset 工具包制作巨怪战士的一些技巧。这位艺术家还贴心地告诉大家&#xff0c;有些步骤是可以省略跳过的&#xff0c;这样就可以节省时间&#xff0c;帮助我们快速完成角色的创作啦。快速有用的步…

Idea上传项目到gitlab并创建使用分支

Idea上传项目到gitlab并创建使用分支 1 配置git 在idea的setting中&#xff0c;找到git&#xff0c;配置好git的位置&#xff0c;点击Test按钮显示出git版本号&#xff0c;则说明配置成功。 2 项目中引入git Idea通过VCS&#xff0c;选择Create Git Repository 在弹出的对话框…

阿里云数据库排行榜_云数据库优惠活动大全

阿里云数据库大全&#xff1a;RDS关系型数据库如MySQL版、PolarDB、PostgreSQL、SQL Server和MariaDB等&#xff0c;NoSQL数据库如Redis、Tair、Lindorm和MongoDB&#xff0c;数据仓库如AnalyticDB MySQL版、PostgreSQL、ClickHouse&#xff0c;阿里云还提供数据库管理工具如数…

com.alibaba.csp.sentinel.slots.block.flow.FlowException: null--记录一次报错

阿丹&#xff1a; 记录一次开发中遇到的错误。 报错信息描述&#xff1a; 2023-10-01 09:47:57.263 ERROR 39572 --- [nio-9100-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exce…

高仿互站网多套模板完整源码

高仿互站网 后台手机端两套模板 电脑端二十套模版&#xff0c;简单介绍几个功能&#xff0c; 支持用户注册开店 开店申请&#xff0c;支持用户发布自己商品 支持卡密形式或实物形式&#xff0c; 支持用户自己发布求助 任务大厅功能&#xff0c;源码完整 更多功能自己去发现吧…

S型速度曲线轨迹规划(约束条件为速度和位移)

S型速度曲线规划的基础知识可以查看下面这篇博客: 带平滑功能的斜坡函数(多段曲线控温纯S型曲线SCL源代码+完整算法分析)_RXXW_Dor的博客-CSDN博客PLC运动控制基础系列之梯形速度曲线,可以参看下面这篇博客:PLC运动控制基础系列之梯形速度曲线_RXXW_Dor的博客-CSDN博客运…

桂院校园导航 静态项目 二次开发教程 1.2

Gitee代码仓库&#xff1a;桂院校园导航小程序 GitHub代码仓库&#xff1a;GLU-Campus-Guide 先 假装 大伙都成功安装了静态项目&#xff0c;并能在 微信开发者工具 和 手机 上正确运行。 接着就是 将项目 改成自己的学校。 代码里的注释我就不说明了&#xff0c;有提到 我…

【Linux】常用命令总结(简略版)

【Linux】常用命令总结&#xff08;简略版&#xff09; 前言常用快捷键操作&#xff1a; 文件管理1、pwd 显示当前路径2、ls查看目录&#xff08;dir 功能一样&#xff09;3、cd 切换到指定路径4、mkdir 创建一个空目录5、rmdir 删除一个空目录6、rm 删除文件或目录7、touch 创…

Cannot find member “window_fullscreen“ in base “OS“.

问题描述 Cannot find member “window_fullscreen” in base “OS”. 回溯方法 func _input(event):if event.is_action_pressed("toggle_fullscreen"):OS.window_fullscreen !OS.window_fullscreenget_tree().set_input_as_handled()问题截图 解决方案: 实现togg…

FreeRTOS(以STM32F1系列为例子)

目录 任务管理任务函数任务控制块顶层任务状态创建任务xTaskCreatexTaskCreateStaticxTaskCreateRestricted 任务优先级和心跳设置心跳设置优先级概述vTaskPrioritySetuxTaskPriorityGet 非运行态扩充阻塞态vTaskDelay挂起状态vTaskSuspend就绪状态完整的状态转换图延迟函数vTa…

【模型压缩】Distiller学习-初认识

Distiller学习-初认识 简介 Intel AILab的神经网络压缩框架&#xff0c;建立在Pytorch基础上 安装 压缩方法 权重正则化方法权重剪枝方法训练后量化方法训练时量化方法条件计算低质分解方法知识蒸馏方法 总体目录 核心代码实现 所有案例的配置文件 举例 初始化网络评价网络…

linux Mysql 8.0.16 安装搭建

文章目录 Mysql 搭建一、安装包下载二、创建用户组用户和修改权限三、配置my.cnf Mysql 搭建 一、安装包下载 mysql 下载地址&#xff1a;https://downloads.mysql.com/archives/community/ 这里有所有的mysql的版本&#xff0c;下载自己需要的版本&#xff0c;我们这里下载 …

2023年中国液压剪行业供需分析:随着基础设施建设发展,销量同比增长6.7%[图]

液压剪是一种利用液压系统驱动的剪切设备&#xff0c;主要用于对金属材料、塑料、纸张等进行剪切加工。液压剪具有高效、精确、稳定的特点&#xff0c;广泛应用于金属加工、机械制造、汽车制造、船舶建造等领域。 液压剪行业分类 近年来&#xff0c;中国政府加大了基础设施建设…

C/C++与汇编混合编程

1. C/C调用汇编 C/C想调用汇编代码必须要注意名称修饰的问题 名称修饰(name decoration): 一种标准的C/C编译技术, 通过添加字符来修改函数名, 添加的字符指明了每个函数参数的确切类型。主要是为了支持函数重载, 但对于汇编来说其问题在于, C/C编译器让链接器去找被修饰过的名…

毅速课堂:3D打印随形水路设计应注意什么?

随形水路是一种基于3D打印技术的新型模具冷却水路&#xff0c;能有效提高冷却效率、缩短冷却周期、提升产品良率、提高生产效率、 与传统的水路设计相比&#xff0c;随形水路更加贴合模具型腔表面&#xff0c;能够更加均匀地分配冷却水&#xff0c;使模具各部分的冷却效果得到有…

Day_17> 动态内存管理

目录 1.为什么存在动态内存分配&#xff1f; 2.动态内存函数的介绍 malloc calloc realloc 3.常见的动态内存错误 1.对NULL指针的解引用操作 2.对动态开辟空间的越界访问 3.对非动态开辟内存使用free释放 4.使用free释放一块动态开辟内存的一部分 5.对同一块动态内…

BUUCTF reverse wp 66 - 70

[SWPU2019]ReverseMe 反编译的伪码看不明白, 直接动调 这里显示"Please input your flag", 然后接受输入, 再和32进行比较, 应该是flag长度要求32位, 符合要求则跳转到loc_E528EE分支继续执行 动调之后伪码可以读了 int __cdecl main(int argc, const char **arg…

5大文件管理操作,Python自动化办公,整明白了

大家好&#xff0c;这里是程序员晚枫。 在更新开源项目&#xff1a;python-office的这1个多月里&#xff0c;又发现了一些新需求&#xff0c;今天整理出来&#xff0c;分享给大家~ 全是自动化办公的常用工具&#xff0c;网友&#xff1a;早知道就好了 1、批量压缩文件夹 电脑…