题目传送门

操作二要求的东西是一个循环迭代的东西,手推相邻两项找下规律,发现相邻两项的分子分母间含有线性关系,考虑用矩阵乘法求解。对于 \([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】单枪匹马(矩阵乘法)的更多相关文章

  1. codevs矩阵乘法系列

    T1:矩阵乘法板子题,练手. #include <map> #include <set> #include <cmath> #include <ctime&g ...

  2. LibreOJ NOI Round #2 Day 1

    LibreOJ NOI Round #2 Day 1 T1: 别被定义弄晕了 反着做,A->1/A+B 取倒数没法做,所以变成a/b,维护2*2的矩阵 区间?不用线段树,不用倍增 存在逆矩阵,直 ...

  3. CH Round #30 摆花[矩阵乘法]

    摆花 CH Round #30 - 清明欢乐赛 背景及描述 艺术馆门前将摆出许多花,一共有n个位置排成一排,每个位置可以摆花也可以不摆花.有些花如果摆在相邻的位置(隔着一个空的位置不算相邻),就不好看 ...

  4. loj#2128. 「HAOI2015」数字串拆分 矩阵乘法

    目录 题目链接 题解 代码 题目链接 loj#2128. 「HAOI2015」数字串拆分 题解 \(f(s)\)对于\(f(i) = \sum_{j = i - m}^{i - 1}f(j)\) 这个 ...

  5. 【LOJ511】[LibreOJ NOI Round #1]验题(动态DP)

    我这道题写了整!整!三!天! 我要一定要写这篇博客来表达我复!杂!的!心!情! 题目 LOJ511 官方题解(这个题解似乎不是很详细,我膜 std 才看懂的) 调这道题验证了我校某人的一句话:调题是一 ...

  6. 「LibreOJ NOI Round #2」不等关系

    「LibreOJ NOI Round #2」不等关系 解题思路 令 \(F(k)\) 为恰好有 \(k\) 个大于号不满足的答案,\(G(k)\) 表示钦点了 \(k\) 个大于号不满足,剩下随便填的 ...

  7. LibreOJ #507. 「LibreOJ NOI Round #1」接竹竿

    二次联通门 : LibreOJ #507. 「LibreOJ NOI Round #1」接竹竿 /* LibreOJ #507. 「LibreOJ NOI Round #1」接竹竿 dp 记录一下前驱 ...

  8. Noip2011 提高组 Day1 T1 铺地毯 + Day2 T1 计算系数

    Day1 T1 题目描述 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯.一共有 n 张地毯,编号从 1 到n .现在将这些地毯按照编号从小 ...

  9. Noip2014 提高组 Day1 T1 生活大爆炸版石头剪刀布 + Day2 T1 无线网络发射器选址

    Day1 T1 题目描述 石头剪刀布是常见的猜拳游戏:石头胜剪刀,剪刀胜布,布胜石头.如果两个人出拳一样,则不分胜负.在<生活大爆炸>第二季第8 集中出现了一种石头剪刀布的升级版游戏. 升 ...

  10. Codevs 1287 矩阵乘法&&Noi.cn 09:矩阵乘法(矩阵乘法练手题)

    1287 矩阵乘法  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Description 小明最近在为线性代数而头疼, ...

随机推荐

  1. nlp入门(三)基于贝叶斯算法的拼写错误检测器

    源码请到:自然语言处理练习: 学习自然语言处理时候写的一些代码 (gitee.com) 数据来源:norvig.com/big.txt 贝叶斯原理可看这里:机器学习算法学习笔记 - 过客匆匆,沉沉浮浮 ...

  2. lazarus、delphi文件Http下载断点续传的实现

    下载大文件时,断点续传是很有必要的,特别是网速度慢且不稳定的情况下,很难保证不出意外,一旦意外中断,又要从头下载,会很让人抓狂.断点续传就能很好解决意外中断情况,再次下载时不需要从头下载,从上次中断处 ...

  3. [Lua][Love Engine] 打砖块游戏实现过程与知识点

    本文旨在根据LOVE2D官方文档和教程实现打砖块的游戏,记录部分实现过程和重要知识点 目标摧毁所有砖块 玩家控制球拍左右滑动反弹小球 小球摧毁砖块 小球保持在屏幕内 小球碰到屏幕底部,GAME OVE ...

  4. 【pandas小技巧】--DataFrame的显示样式

    上一篇介绍了DataFrame的显示参数,主要是对DataFrame中值进行调整. 本篇介绍DataFrame的显示样式的调整,显示样式主要是对表格本身的调整,比如颜色,通过颜色可以突出显示重要的值, ...

  5. 小白python和pycharm安装大佬勿扰

    编程语言发展和Python安装 计算机语言的发展 机器语言 1946年2月14日,世界上第一台计算机ENIAC诞生,使用的是最原始的穿孔卡片.这种卡片上使用的语言是只有专家才能理解的语言,与人类语言差 ...

  6. DesignPattern-part3

    title: "modern C++ DesignPattern-Part3" date: 2018-04-12T19:08:49+08:00 lastmod: 2018-04-1 ...

  7. IDEA 配置桌面快捷方式

    IDEA 配置桌面快捷方式 目录 IDEA 配置桌面快捷方式 1.下载idea.tar解压 2.配置快捷方式 3.为什么要存放在这个目录? 1.下载idea.tar解压 tar xf ideaIC-2 ...

  8. Seata AT和XA模式

    一.分布式事务产生得原因: 1.1.数据库分库分表 当数据库单表一年产生的数据超过1000W,那么就要考虑分库分表,具体分库分表的原理在此不做解释,以后有空详细说,简单的说就是原来的一个数据库变成了多 ...

  9. 「atcoder - abc246h」01? Queries

    link. 平时基本打不到 ex,这个 ex 还是比较 ez 的,但也有些需要注意的地方. 考虑 dp 规划前缀,设 \(f[i][0/1]\) 表示前缀 \([1, i]\) 否是选 \(i\) 的 ...

  10. Solution Set -「ABC 183」

    本来十分抗拒,但 GM 强制. 「ABC 183A」ReLU Link. 略. #include<cstdio> int main() { long long n; scanf(" ...