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

$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. jenkins最新版下载安装

    前提:安装配置 jetty 在线下载jetty# wget http://download.eclipse.org/jetty/8.1.17.v20150415/dist/jetty-distribu ...

  2. [转帖]再谈IO的异步,同步,阻塞和非阻塞

    再谈IO的异步,同步,阻塞和非阻塞 https://yq.aliyun.com/articles/53674?spm=a2c4e.11155435.0.0.48bfe8efHUE8wg   krypt ...

  3. 关于wireshark的过滤器规则学习小结

    关于wireshark的过滤器规则学习小结 [前言] 这两天一直在熟悉wireshark的过滤器语法规则,以前也接触过这个工具,但只是学校老师教的如何去选择一个接口进行抓取,以及如何去分析一个包的数据 ...

  4. Python23之内置函数filter()和map()

    首先我们了解一个概念:迭代 迭代是访问集合元素的⼀种⽅式.迭代器是⼀个可以记住遍历的位置的对象.迭代器对象从集合的第⼀个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退. 我们已经知道 ...

  5. Scrapy框架1——简单使用

    一.设置与编写 打开cmd,选择好路径 1.创建项目scrapy startproject projectname d:\爬虫\11.scrapy>scrapy startproject tes ...

  6. 07 IO流(四)——文件字节流 FileInputStream/FileOutputStream与文件的拷贝

    两个类的简述 专门用来对文件进行读写的类. 父类是InputStream.OutputStream 文件读入细节 FileOutputStream流的构造方法:new FileOutputStream ...

  7. 使用Python模块儿csv快速处理csv文件

    代码如下: import csv with open('test.csv',newline='') as f:     reader = csv.reader(f)     for row in re ...

  8. 【HC89S003F4开发板】 2调度器

    HC89S003F4开发板调度器调试 一.前言 逛论坛看到有人给HC89做了调度器,调度部分直接操作堆栈的. 下载链接 下载下来调试看看. 二.用户代码 @实现效果 编译后led灯闪烁 #includ ...

  9. wstngfw中配置freeradius

    wstngfw中配置freeradius Radius为各种网络设备和服务提供了一个认证来源. Radius认证常用于***.入网门户.交换机.路由器和防火墙.Radius认证比在网络上的不同设备跟踪 ...

  10. POJ1475(Pushing Boxes)--bbffss

    题目在这里 题目一看完就忙着回忆童年了.推箱子的游戏. 假设只有一个箱子.游戏在一个R行C列的由单位格子组成的区域中进行,每一步, 你可以移动到相邻的四个格子中的一个,前提是那个格子是空的:或者,如果 ...