题意:

\(M_i\)为一个\(m*m\)矩阵,已知

\[\begin{aligned}
&M_0=A\\
&M_i=(\prod_{j=c_i}^{i+1}M_j)B
\end{aligned}
\]

问\(M_n\)矩阵,输入包含\(n,m,A,B,c_1\cdots c_n(c_1\leq c_2\cdots \leq c_n)\)。

思路:

因为\(c_1\leq c_2\cdots \leq c_n\),所以我们只需实现一个队列,满足能从队头\(pop\),从队尾\(push\),并且能求队列内乘积。可以通过两个栈实现。

栈\(suf\)保存的是后缀的乘积,\(pre\)保存的是前缀的乘积,那么\(push\)时放到\(pre\)维护前缀积并储存放进去的矩阵,\(pop\)时直接把\(suf\)最前面的后缀弹出即可。如果\(suf\)空了,那么把\(pre\)里的内容暴力变成后缀放到\(suf\)里。可以知道每个矩阵最多进两次栈,复杂度\(O(nm^2)\)。

代码:

#include<set>
#include<map>
#include<cmath>
#include<queue>
#include<bitset>
#include<string>
#include<cstdio>
#include<vector>
#include<cstring>
#include <iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn = 1e6 + 5;
const int M = 50 + 5;
const ull seed = 131;
const int INF = 0x3f3f3f3f;
const ll MOD = 1000000007;
struct Mat{
int s[5][5];
void init(){memset(s, 0, sizeof(s));}
};
int n, m, mod;
int ksc(ll a, ll b, ll p){
ll t = a * b - (ll)((long double)a * b / p + 0.5) * p;
t = (t < 0)? t + p : t;
return (int)t;
}
inline Mat mul(Mat a, Mat b){
Mat c;
c.init();
for(int i = 0; i < m; i++){
for(int j = 0; j < m; j++){
for(int k = 0; k < m; k++){
c.s[i][j] = (c.s[i][j] + ksc(a.s[i][k], b.s[k][j], mod)) % mod;
}
}
}
return c;
}
Mat pre[maxn], suf[maxn], a[maxn];
int cnt1, cnt2, c[maxn];
void ins(Mat x){
if(cnt1 == 0) pre[++cnt1] = x;
else{
pre[++cnt1] = x;
pre[cnt1] = mul(pre[cnt1 - 1], x);
}
a[cnt1] = x;
}
void del(){
if(cnt2 == 0){
for(int i = cnt1; i >= 1; i--){
if(cnt2 == 0) suf[++cnt2] = a[i];
else suf[++cnt2] = a[i], suf[cnt2] = mul(suf[cnt2], suf[cnt2 - 1]);
}
cnt1 = 0;
}
cnt2--;
}
int main(){
while(~scanf("%d%d%d", &n, &m, &mod)){
cnt1 = cnt2 = 0;
Mat A, B, ret;
for(int i = 0; i < m; i++){
for(int j = 0; j < m; j++){
scanf("%d", &A.s[i][j]);
}
}
for(int i = 0; i < m; i++){
for(int j = 0; j < m; j++){
scanf("%d", &B.s[i][j]);
}
}
for(int i = 1; i <= n; i++) scanf("%d", &c[i]);
int L = 0;
ins(A);
for(int i = 1; i <= n; i++){
while(L < c[i]) del(), L++;
if(cnt1 && cnt2) ret = mul(suf[cnt2], pre[cnt1]);
else if(cnt1) ret = pre[cnt1];
else ret = suf[cnt2];
ret = mul(ret, B);
ins(ret);
}
for(int i = 0; i < m; i++){
for(int j = 0; j < m; j++){
printf("%d%c", ret.s[i][j], j == m - 1? '\n' : ' ');
}
}
}
return 0;
}

Petrozavodsk Winter Training Camp 2017G(栈)题解的更多相关文章

  1. 2015-2016 Petrozavodsk Winter Training Camp, Nizhny Novgorod SU Contest (5/9)

    2015-2016 Petrozavodsk Winter Training Camp, Nizhny Novgorod SU Contest B. Forcefield 题意 给你一维平面上n个镜子 ...

  2. 2015 UESTC Winter Training #7【2010-2011 Petrozavodsk Winter Training Camp, Saratov State U Contest】

    2015 UESTC Winter Training #7 2010-2011 Petrozavodsk Winter Training Camp, Saratov State U Contest 据 ...

  3. Petrozavodsk Winter Training Camp 2018

    Petrozavodsk Winter Training Camp 2018 Problem A. Mines 题目描述:有\(n\)个炸弹放在\(x\)轴上,第\(i\)个位置为\(p_i\),爆炸 ...

  4. 2014-2015 Petrozavodsk Winter Training Camp, Contest.58 (Makoto rng_58 Soejima contest)

    2014-2015 Petrozavodsk Winter Training Camp, Contest.58 (Makoto rng_58 Soejima contest) Problem A. M ...

  5. Gym - 100162G 2012-2013 Petrozavodsk Winter Training Camp G. Lyndon Words 暴力枚举

    题面 题意:如果一个字符串的最小表示法是他自己,他就是一个Lyndon Word. 例如  aabcb 他的循环串有 abcba  bcbaa cbaab baabc 其中字典序最小的是他自己 现在给 ...

  6. Petrozavodsk Winter Training Camp 2016: Moscow SU Trinity Contest

    题目列表 A.ABBA E.Elvis Presley G. Biological Software Utilities J. Burnished Security Updates A.ABBA 题意 ...

  7. 【推导】【数学期望】【冒泡排序】Petrozavodsk Winter Training Camp 2018 Day 5: Grand Prix of Korea, Sunday, February 4, 2018 Problem C. Earthquake

    题意:两地之间有n条不相交路径,第i条路径由a[i]座桥组成,每座桥有一个损坏概率,让你确定一个对所有桥的检测顺序,使得检测所需的总期望次数最小. 首先,显然检测的时候,是一条路径一条路径地检测,跳跃 ...

  8. 【线段树】【扫描线】Petrozavodsk Winter Training Camp 2018 Day 5: Grand Prix of Korea, Sunday, February 4, 2018 Problem A. Donut

    题意:平面上n个点,每个点带有一个或正或负的权值,让你在平面上放一个内边长为2l,外边长为2r的正方形框,问你最大能圈出来的权值和是多少? 容易推出,能框到每个点的 框中心 的范围也是一个以该点为中心 ...

  9. 【取对数】【哈希】Petrozavodsk Winter Training Camp 2018 Day 1: Jagiellonian U Contest, Tuesday, January 30, 2018 Problem J. Bobby Tables

    题意:给你一个大整数X的素因子分解形式,每个因子不超过m.问你能否找到两个数n,k,k<=n<=m,使得C(n,k)=X. 不妨取对数,把乘法转换成加法.枚举n,然后去找最大的k(< ...

随机推荐

  1. 爬虫学习(三)Chrome浏览器使用

    一.新建隐身窗口 在打开隐身窗口的时候,第一次请求某个网站是没有携带cookie的,和代码请求一个网站一样,不携带cookie.这样就能够尽可能的理解代码请求某个网站的结果:除非数据是通过js加载出来 ...

  2. 使用axis1.4生成webservice的客户端代码

    webservice服务端: https://blog.csdn.net/ghsau/article/details/12714965 跟据WSDL文件地址生成客服端代码: 1.下载 axis1.4 ...

  3. [Usaco2007 Jan]Telephone Lines架设电话线

    题目描述 FarmerJohn打算将电话线引到自己的农场,但电信公司并不打算为他提供免费服务.于是,FJ必须为此向电信公司支付一定的费用.FJ的农场周围分布着N(1<=N<=1,000)根 ...

  4. ClickHouse入门:表引擎-HDFS

    前言插件及服务器版本服务器:ubuntu 16.04Hadoop:2.6ClickHouse:20.9.3.45 文章目录 简介 引擎配置 HDFS表引擎的两种使用形式 引用 简介 ClickHous ...

  5. 生僻标签 fieldset 与 legend 的妙用

    谈到 <fieldset> 与 <legend>,大部分人肯定会比较陌生,在 HTML 标签中,属于比较少用的那一批. 我最早知道这两个标签,是在早年学习 reset.css ...

  6. uni-app开发经验分享五: 解决三端页面兼容问题的方法

    在做uni-app开发的过程中,我们最头疼可能不是开发的过程中的逻辑,而是最后要做的三端兼容测试和修改,在我开发的项目中,这一步都是最头疼和令人头秃的过程,这里总结一些个人开发遇到的问题,希望对大家有 ...

  7. (ETL)ETL架构师面试题(转载)

    1. What is a logical data mapping and what does it mean to the ETL team?什么是逻辑数据映射?它对ETL项目组的作用是什么? 答: ...

  8. 美团配送A/B评估体系建设与实践

    https://mp.weixin.qq.com/s/v3Fvp6Hed7ZGoE8FGlGMvQ

  9. JAVA中两个int类型的变量在不借助第三个变量的情况下完成值的互换

    在面试中被问到这个问题,想到两种解决方式,在此分享一下. 第一种,使用简单的数学运算达到目标(但是面试官往往会问你还有没有其他方式): public static void main(String[] ...

  10. loj10003加工生产调度

    题目描述 某工厂收到了 n个产品的订单,这  个产品分别在 A.B 两个车间加工,并且必须先在 A 车间加工后才可以到 B 车间加工. 某个产品 i 在 A,B 两车间加工的时间分别为 A_i,B_i ...