【LOJ NOI Round#2 Day1 T1】单枪匹马(矩阵乘法)
操作二要求的东西是一个循环迭代的东西,手推相邻两项找下规律,发现相邻两项的分子分母间含有线性关系,考虑用矩阵乘法求解。对于 \([1,n]\)的询问,从后往前倒推, \(x_{n-1}=a_{n-1} \times x_{n} + y_{n}\), \(y_{n-1}=x_{n}\),其中 \(x_{n}=a_{n},y_{n}=1\), \(x_{i},y_{i}\)分别代表从后往前计算到第 \(i\)项时的分子分母,第 \(i\)个数的初始矩阵为 \(\left[ \begin{matrix} 0 & 1 \\ 1 & a_{i} \end{matrix} \right]\),这样从后往前乘,最终得到的矩阵的 \(matrix[1][2]\)即为 \(y\)值, \(matrix[2][2]\)即为 \(x\)值。所以做一下前缀积即可,用数组 \(pre\)表示。对于 \([l,r]\)的询问,计算逆矩阵前缀积,用数组 \(inv\_pre\)表示,第 \(i\)项的初始逆矩阵为 \(\left[ \begin{matrix} -a_{i} & 1 \\ 1 & 0 \end{matrix} \right]\)。答案等于 \(inv\_pre[l-1] \times pre[r]\),因为矩阵乘法不满足交换律,所以注意乘的顺序,\(inv\_pre\)要倒着乘,具体看代码。
#include<cstdio>
#include<cstring>
const int mod = 998244353;
const int N = 1e6 + 5;
struct Matrix{
int a[3][3];
Matrix() { memset(a, 0, sizeof(a)); }
Matrix operator *(const Matrix &ret)const{
Matrix ans;
for(int k = 1; k <= 2; ++k)
for(int i = 1; i <= 2; ++i)
for(int t = 1; t <= 2; ++t)
ans.a[i][t] = (ans.a[i][t] + 1LL * a[i][k] * ret.a[k][t]) % mod;
return ans;
}
}pre[N], inv_pre[N];
int n, m, type, cnt;
void add(int pos, int num){
pre[pos].a[1][2] = pre[pos].a[2][1] = 1;
pre[pos].a[2][2] = num;
inv_pre[pos].a[1][2] = inv_pre[pos].a[2][1] = 1;
inv_pre[pos].a[1][1] = mod - num;
pre[pos] = pre[pos - 1] * pre[pos];
inv_pre[pos] = inv_pre[pos] * inv_pre[pos - 1]; // 倒着乘
}
int main(){
scanf("%d%d%d", &n, &m, &type); cnt = n;
pre[0].a[1][1] = pre[0].a[2][2] = 1;
inv_pre[0].a[1][1] = inv_pre[0].a[2][2] = 1;
for(int i = 1, x; i <= n; ++i){
scanf("%d", &x);
add(i, x);
}
int opt, l, r, x, last = 0;
while(m--){
scanf("%d", &opt);
if(opt == 1){
scanf("%d", &x);
if(type) x ^= last;
add(++cnt, x);
}
else{
scanf("%d%d", &l, &r);
if(type) l ^= last, r ^= last;
Matrix p = inv_pre[l - 1] * pre[r];
int x = p.a[2][2], y = p.a[1][2];
last = x ^ y;
printf("%d %d\n", x, y);
}
}
return 0;
}
【LOJ NOI Round#2 Day1 T1】单枪匹马(矩阵乘法)的更多相关文章
- codevs矩阵乘法系列
T1:矩阵乘法板子题,练手. #include <map> #include <set> #include <cmath> #include <ctime&g ...
- LibreOJ NOI Round #2 Day 1
LibreOJ NOI Round #2 Day 1 T1: 别被定义弄晕了 反着做,A->1/A+B 取倒数没法做,所以变成a/b,维护2*2的矩阵 区间?不用线段树,不用倍增 存在逆矩阵,直 ...
- CH Round #30 摆花[矩阵乘法]
摆花 CH Round #30 - 清明欢乐赛 背景及描述 艺术馆门前将摆出许多花,一共有n个位置排成一排,每个位置可以摆花也可以不摆花.有些花如果摆在相邻的位置(隔着一个空的位置不算相邻),就不好看 ...
- loj#2128. 「HAOI2015」数字串拆分 矩阵乘法
目录 题目链接 题解 代码 题目链接 loj#2128. 「HAOI2015」数字串拆分 题解 \(f(s)\)对于\(f(i) = \sum_{j = i - m}^{i - 1}f(j)\) 这个 ...
- 【LOJ511】[LibreOJ NOI Round #1]验题(动态DP)
我这道题写了整!整!三!天! 我要一定要写这篇博客来表达我复!杂!的!心!情! 题目 LOJ511 官方题解(这个题解似乎不是很详细,我膜 std 才看懂的) 调这道题验证了我校某人的一句话:调题是一 ...
- 「LibreOJ NOI Round #2」不等关系
「LibreOJ NOI Round #2」不等关系 解题思路 令 \(F(k)\) 为恰好有 \(k\) 个大于号不满足的答案,\(G(k)\) 表示钦点了 \(k\) 个大于号不满足,剩下随便填的 ...
- LibreOJ #507. 「LibreOJ NOI Round #1」接竹竿
二次联通门 : LibreOJ #507. 「LibreOJ NOI Round #1」接竹竿 /* LibreOJ #507. 「LibreOJ NOI Round #1」接竹竿 dp 记录一下前驱 ...
- Noip2011 提高组 Day1 T1 铺地毯 + Day2 T1 计算系数
Day1 T1 题目描述 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯.一共有 n 张地毯,编号从 1 到n .现在将这些地毯按照编号从小 ...
- Noip2014 提高组 Day1 T1 生活大爆炸版石头剪刀布 + Day2 T1 无线网络发射器选址
Day1 T1 题目描述 石头剪刀布是常见的猜拳游戏:石头胜剪刀,剪刀胜布,布胜石头.如果两个人出拳一样,则不分胜负.在<生活大爆炸>第二季第8 集中出现了一种石头剪刀布的升级版游戏. 升 ...
- Codevs 1287 矩阵乘法&&Noi.cn 09:矩阵乘法(矩阵乘法练手题)
1287 矩阵乘法 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 小明最近在为线性代数而头疼, ...
随机推荐
- 一文了解react中定义样式(css/less/sass)的常用方法
react中通过jsx的语法方式,将html标签和js语法联系在一起,而css的编写方式,没有明确的指定编写方式,目前就有很多不同方法,每个方式各有其优缺点,我们一起来看看常用的定义方式有哪些. 最基 ...
- 使用ClamAV进行linux病毒扫描
前言 ClamAV是一个在命令行下查毒(并非杀毒)的软件,其免费开源跨平台.ClamAV默认只能查出服务器内的病毒,但是无法清除,最多删除. 安装ClamAV yum install -y epel- ...
- Nginx深入:nginx功能模块、目录结构及配置文件详解
Nginx功能模块说明 1.Nginx 核心功能模块(Core functionality) Nginx核心功能模块负责Nginx的全局应用,主要对应主配置文件的核心层(Main层)和事件(Event ...
- win10安装Redis5、配置自启动教程
前提条件:首先我安装的是压缩包版的Redis5.0.14.1,下载链接为 https://github.com/tporadowski/redis/releases 安装教程 下载软件并解压 进入软件 ...
- ❤️ GitHub Copilot 读心术揭秘,Copilot 逆向工程笔记
总览 你是否好奇 GitHub Copilot 如何知道你想写的内容?有时候它聪明得甚至好像读过你项目里其他文件一样,不要怀疑,它确实读过.这篇文章记录了我阅读一个对 Copilot 的逆向工程的笔记 ...
- 一文读懂LockSupport
阅读本文前,需要储备的知识点如下,点击链接直接跳转. java线程详解 Java不能操作内存?Unsafe了解一下 LockSupport介绍 搞java开发的基本都知道J.U.C并发包(即java. ...
- 9k+ Star 简洁好用的开源 Linux 运维管理面板
如果你的公司需要进行服务器运维管理,那么运维管理面板就是一个不可或缺的需求.因为并非每一位运维工程师都能在命令行下游刃有余,不需要借助辅助工具就能确保服务器安全.流畅运行.尤其是对于刚刚踏入运维领域的 ...
- 原来你是这样的JAVA[06]-反射
1.JVM为每个加载的class及interface创建了对应的Class实例来保存class及interface的所有信息: 获取一个class对应的Class实例后,就可以获取该class的所有信 ...
- Redis沙盒逃逸(CVE-2022-0543)漏洞复现
0x01 概述 Redis 是著名的开源 Key-Value 数据库,其具备在沙箱中执行 Lua 脚本的能力.Debian 以及 Ubuntu 发行版的源在打包 Redis 时,在 Lua 沙箱中遗留 ...
- 如何实现一个数据库的 UDF?图数据库 NebulaGraph UDF 功能背后的设计与思考
大家好,我是来自 BOSS直聘的赵俊南,主要负责安全方面的图存储相关工作.作为一个从 v1.x 用到 v3.x 版本的忠实用户,在见证 NebulaGraph 发展的同时,也和它一起成长. BOSS直 ...