【xsy1103】随机数表(RanMat)矩阵快速幂
题目大意:你生成了一个随机数表,生成机制是这样子的:
$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)矩阵快速幂的更多相关文章
- 矩阵快速幂 HDU 4565 So Easy!(简单?才怪!)
题目链接 题意: 思路: 直接拿别人的图,自己写太麻烦了~ 然后就可以用矩阵快速幂套模板求递推式啦~ 另外: 这题想不到或者不会矩阵快速幂,根本没法做,还是2013年长沙邀请赛水题,也是2008年Go ...
- 51nod 算法马拉松18 B 非010串 矩阵快速幂
非010串 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 如果一个01字符串满足不存在010这样的子串,那么称它为非010串. 求长度为n的非010串的个数.(对1e9+7取模) ...
- 51nod 1113 矩阵快速幂
题目链接:51nod 1113 矩阵快速幂 模板题,学习下. #include<cstdio> #include<cmath> #include<cstring> ...
- 【66测试20161115】【树】【DP_LIS】【SPFA】【同余最短路】【递推】【矩阵快速幂】
还有3天,今天考试又崩了.状态还没有调整过来... 第一题:小L的二叉树 勤奋又善于思考的小L接触了信息学竞赛,开始的学习十分顺利.但是,小L对数据结构的掌握实在十分渣渣.所以,小L当时卡在了二叉树. ...
- 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 ...
- 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 输 ...
- hdu2604(递推,矩阵快速幂)
题目链接:hdu2604 这题重要的递推公式,找到公式就很easy了(这道题和hdu1757(题解)类似,只是这道题需要自己推公式) 可以直接找规律,推出递推公式,也有另一种找递推公式的方法:(PS: ...
- 矩阵乘法&矩阵快速幂&矩阵快速幂解决线性递推式
矩阵乘法,顾名思义矩阵与矩阵相乘, 两矩阵可相乘的前提:第一个矩阵的行与第二个矩阵的列相等 相乘原则: a b * A B = a*A+b*C a*c+b*D c d ...
- hdu4965 Fast Matrix Calculation (矩阵快速幂 结合律
http://acm.hdu.edu.cn/showproblem.php?pid=4965 2014 Multi-University Training Contest 9 1006 Fast Ma ...
随机推荐
- redhat与zlib兼容性问题?
今天在redhat 6.3 x64版本上安装了zlib,安装完后可以正常使用,就是发现gedit使用有点异常——无法启动,当时也没在意,但是后来重启电脑后出现桌面背景图片后就不弹出登陆窗口了,但是进命 ...
- zend framework多模块多Layout配置
转自: http://blog.csdn.net/a82168506/article/details/10228011 上次接触zend framework已经很久远了,10年的事情了.最近在做一个项 ...
- OpenCV基于字节指针进行高效像素遍历
直接获取Mat对象的像素块的数据指针,基于字节指针操作,实现快速像素遍历方法(1280x720, 彩色,仅需几毫秒完成).Mat对象的数据组织形式与像素块数据的存储方式,Mat对象由两个部分组成,元数 ...
- Spring之2:HierarchicalBeanFactory接口
HierarchicalBeanFactory:HierarchicalBeanFactory继承BeanFactory并扩展使其支持层级结构.getParentBeanFactory()方法或者父级 ...
- springboot2.x日志配置记录
springboot日志管理: springboot2.x默认使用commons-logging作为内部日志的输出,日志的实现可以选择Java Util Logging,Log4J2和logback如 ...
- Java静态分派和动态分派
前言 动态分派和静态分派机制是Java多态实现的原理.本文将针对这两种机制进行浅析. 静态分派 静态分派机制最典型的代码示例如下 void test() { Father father = new S ...
- Mac中设置Sublime快速在终端中使用命令打开项目
工作中用Atom比较多,比较喜欢Atom可以直接在终端中直接输入atom .就能直接打开项目的功能,于是搜索得知sublime text也有这样的功能,下面就简单的配置了一下: sudo ln -s ...
- ~ubuntu1804安装禅道
一.解压禅道安装包 二.启动禅道 # 开启Apache和Mysql服务 /opt/zbox/zbox start # 停止Apache和Mysql服务 /opt/zbox/zbox stop # 命令 ...
- react 提示消息队列 (支持动态添加,删除,多实例化)
import React from 'react' import PropTypes from 'prop-types' import AnimationOperateFeedbackInfo fro ...
- vmware vSphere Data Protection 6.1--------2-初始化
一.简介 安装完vdp接下来就是部署初始化了 安装篇请参考:vmware vSphere Data Protection 6.1部署 二.开始初始化 登陆https://192.168.216.200 ...