题目大意:你生成了一个随机数表,生成机制是这样子的:

$a[i]=A1a[i-1]+A2(2≤i≤m)$

$b[i]=B1b[i-1]+B2(2≤i≤m)$

$M[1][y]=a[y]%P,(1≤y≤m)$

$M[x][1]=b[x]%P,(2≤x≤n)$

$M[x][y]=(\sum\limits_{i=1}^{x-1}\sum\limits_{j=1}^{y-1} M[i][j])%P,(2≤x≤n,2≤y≤m)$

有$k$组询问,每次问你$M[x][y]$的值。

数据范围:$n≤50$,$m≤10^9$,$k≤10$,$P≤32768$

我们考虑$y=1$和$x=1$的情况,这两种情况直接等于$a$或$b$,直接矩阵快速幂就可以了。

对于非这两种的情况,我们考虑一个$1\times n+2$的矩阵

我们用这个矩阵的前$n$个数表示第i行的前缀和,第$n+1$个数为$M[1][j]$的值,第$n+2$个数恒为$1$,大概长这样:

$\begin{bmatrix}
s(1,i),s(2,i)\cdots s(n-1,i),s(n,i),a[i],1
\end{bmatrix}$

其中$s(x,y)=\sum\limits_{i=1}^{y} M[x][i]$

然后,我们考虑构造一个矩阵,使得上面这个矩阵乘上它后,可以变成

$\begin{bmatrix}
s(1,i+1),s(2,i+1)\cdots s(n-1,i+1),s(n,i+1),a[i+1],1
\end{bmatrix}$

不难推出这个矩阵是长这样的:

$\begin{bmatrix}1 , 1 , 1 ,\cdots 1 , 0 , 0\\0,1,1,\cdots 1,0,0\\0,0,1,\cdots 1,0,0\\ \vdots \ \ \ \ \ddots \ \ \ \ \ \ \vdots
\\ 0,0,0,\cdots 1,0,0\\
A1,0,0,\cdots A1,0\\
A2,0,0,\cdots A2,0\\ \end{bmatrix} $

假设我们需要求$M[x][y]$,我们可以通过矩阵快速幂,先求出

$\begin{bmatrix}
s(1,y-1),s(2,y-1)\cdots s(n-1,y-1),s(n,y-1),a[y-1],1
\end{bmatrix}$

然后$M[x][y]$显然等于$\sum\limits_{i=1}^{x-1} s(i,y-1)$。

然后就做完了。

完结撒花

 #include<bits/stdc++.h>
#define M 55
using namespace std;
int MOD;
struct mat{
int a[M][M],n,m; mat(){memset(a,,sizeof(a));}
mat(int nn,int mm){n=nn; m=mm; memset(a,,sizeof(a));}
int* operator [](int x) {return a[x];}
friend mat operator *(mat a,mat b){
mat c=mat(a.n,b.m);
for(int i=;i<=c.n;i++)
for(int j=;j<=c.m;j++)
for(int k=;k<=b.n;k++)
c[i][j]=(c[i][j]+a[i][k]*b[k][j])%MOD;
return c;
}
void dw(){memset(a,,sizeof(a)); for(int i=;i<=n;i++) a[i][i]=;}
friend mat operator ^(mat a,int b){
mat ans=mat(a.n,a.m); ans.dw();
while(b){
if(b&) ans=ans*a;
a=a*a; b>>=;
}
return ans;
}
}; int n,m;
int a[M]={},A1,A2,B1,B2;
int main(){
cin>>n>>m>>MOD;
cin>>a[]>>B1>>B2;cin>>A1>>A2;
for(int i=;i<=n;i++) a[i]=(a[i-]*A1+A2)%MOD; mat f=mat(n+,n+),g=mat(,n+);
for(int i=;i<=n;i++) g[][i]=a[i];
g[][n+]=a[]; g[][n+]=; for(int i=;i<=n;i++) for(int j=;j<=i;j++) f[j][i]=;
f[n+][]=f[n+][n+]=B1;
f[n+][]=f[n+][n+]=B2;
f[n+][n+]=; int q; scanf("%d",&q);
while(q--){
int x,y; scanf("%d%d",&x,&y);
if(y==) {printf("%d\n",a[x]); continue;}
mat F=f^(y-);
mat ans=g*F;
if(x==) {
ans=ans*f;
printf("%d\n",ans[][n+]);
continue;
}
int sum=;
for(int i=;i<x;i++) sum=(sum+ans[][i])%MOD;
printf("%d\n",sum);
}
}

【xsy1103】随机数表(RanMat)矩阵快速幂的更多相关文章

  1. 矩阵快速幂 HDU 4565 So Easy!(简单?才怪!)

    题目链接 题意: 思路: 直接拿别人的图,自己写太麻烦了~ 然后就可以用矩阵快速幂套模板求递推式啦~ 另外: 这题想不到或者不会矩阵快速幂,根本没法做,还是2013年长沙邀请赛水题,也是2008年Go ...

  2. 51nod 算法马拉松18 B 非010串 矩阵快速幂

    非010串 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 如果一个01字符串满足不存在010这样的子串,那么称它为非010串. 求长度为n的非010串的个数.(对1e9+7取模) ...

  3. 51nod 1113 矩阵快速幂

    题目链接:51nod 1113 矩阵快速幂 模板题,学习下. #include<cstdio> #include<cmath> #include<cstring> ...

  4. 【66测试20161115】【树】【DP_LIS】【SPFA】【同余最短路】【递推】【矩阵快速幂】

    还有3天,今天考试又崩了.状态还没有调整过来... 第一题:小L的二叉树 勤奋又善于思考的小L接触了信息学竞赛,开始的学习十分顺利.但是,小L对数据结构的掌握实在十分渣渣.所以,小L当时卡在了二叉树. ...

  5. HDU5950(矩阵快速幂)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5950 题意:f(n) = f(n-1) + 2*f(n-2) + n^4,f(1) = a , f(2 ...

  6. 51nod 1126 矩阵快速幂 水

    有一个序列是这样定义的:f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7. 给出A,B和N,求f(n)的值. Input 输 ...

  7. hdu2604(递推,矩阵快速幂)

    题目链接:hdu2604 这题重要的递推公式,找到公式就很easy了(这道题和hdu1757(题解)类似,只是这道题需要自己推公式) 可以直接找规律,推出递推公式,也有另一种找递推公式的方法:(PS: ...

  8. 矩阵乘法&矩阵快速幂&矩阵快速幂解决线性递推式

    矩阵乘法,顾名思义矩阵与矩阵相乘, 两矩阵可相乘的前提:第一个矩阵的行与第二个矩阵的列相等 相乘原则: a b     *     A B   =   a*A+b*C  a*c+b*D c d     ...

  9. hdu4965 Fast Matrix Calculation (矩阵快速幂 结合律

    http://acm.hdu.edu.cn/showproblem.php?pid=4965 2014 Multi-University Training Contest 9 1006 Fast Ma ...

随机推荐

  1. redhat与zlib兼容性问题?

    今天在redhat 6.3 x64版本上安装了zlib,安装完后可以正常使用,就是发现gedit使用有点异常——无法启动,当时也没在意,但是后来重启电脑后出现桌面背景图片后就不弹出登陆窗口了,但是进命 ...

  2. zend framework多模块多Layout配置

    转自: http://blog.csdn.net/a82168506/article/details/10228011 上次接触zend framework已经很久远了,10年的事情了.最近在做一个项 ...

  3. OpenCV基于字节指针进行高效像素遍历

    直接获取Mat对象的像素块的数据指针,基于字节指针操作,实现快速像素遍历方法(1280x720, 彩色,仅需几毫秒完成).Mat对象的数据组织形式与像素块数据的存储方式,Mat对象由两个部分组成,元数 ...

  4. Spring之2:HierarchicalBeanFactory接口

    HierarchicalBeanFactory:HierarchicalBeanFactory继承BeanFactory并扩展使其支持层级结构.getParentBeanFactory()方法或者父级 ...

  5. springboot2.x日志配置记录

    springboot日志管理: springboot2.x默认使用commons-logging作为内部日志的输出,日志的实现可以选择Java Util Logging,Log4J2和logback如 ...

  6. Java静态分派和动态分派

    前言 动态分派和静态分派机制是Java多态实现的原理.本文将针对这两种机制进行浅析. 静态分派 静态分派机制最典型的代码示例如下 void test() { Father father = new S ...

  7. Mac中设置Sublime快速在终端中使用命令打开项目

    工作中用Atom比较多,比较喜欢Atom可以直接在终端中直接输入atom .就能直接打开项目的功能,于是搜索得知sublime text也有这样的功能,下面就简单的配置了一下: sudo ln -s ...

  8. ~ubuntu1804安装禅道

    一.解压禅道安装包 二.启动禅道 # 开启Apache和Mysql服务 /opt/zbox/zbox start # 停止Apache和Mysql服务 /opt/zbox/zbox stop # 命令 ...

  9. react 提示消息队列 (支持动态添加,删除,多实例化)

    import React from 'react' import PropTypes from 'prop-types' import AnimationOperateFeedbackInfo fro ...

  10. vmware vSphere Data Protection 6.1--------2-初始化

    一.简介 安装完vdp接下来就是部署初始化了 安装篇请参考:vmware vSphere Data Protection 6.1部署 二.开始初始化 登陆https://192.168.216.200 ...