【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 ...
随机推荐
- 《ucore lab4》实验报告
资源 ucore在线实验指导书 我的ucore实验代码 练习1:分配并初始化一个进程控制块 题目 alloc_proc函数(位于kern/process/proc.c中) 负责分配并返回一个新的str ...
- Java:session中的invalidate()的作用是什么呢?求解
手工杀会话.会话失效有2种可能:超时和手工杀会话.手工杀方便省时间,程序员都爱用. 比如我做一个程序需要登录,中间访问的页面有会话控制,如果没有登录则跳转到登录页面,退出时清会话信息. 这是有两个选择 ...
- (8)Spring Boot 与数据访问
文章目录 简介 整合基本的JDBC与数据源 整合 druid 数据源 整合 mybatis 简介 对于数据访问层,无论是 SQL 还是 NOSQL ,Spring Boot 默认都采用整合 Sprin ...
- django使用pyecharts(6)----django加入echarts_增量更新_定长_坐标轴定长
六.Django 前后端分离_定时增量更新图表(坐标轴定长) 1.安装 djangorestframework linux pip3 install djangorestframework windo ...
- 【自学系列一】HTML5大前端学习路线+视频教程(完整版)
今年,本公司全新发布了囊括Java.HTML5前端.大数据.Python爬虫.全链UI设计.软件测试.Unity 3D.Go语言等多个技术方向的全套视频. 面对这么多的知识点,有的盆友就麻爪了…… 我 ...
- jquery中checkbox的全选与反选
<!DOCTYPE html><html><head> <meta charset="utf-8" /> <title> ...
- vue导出Excel文件
1.需要安装file-saver和script-loader.xlsx npm install file-saver / yarn add file-saver npm install script- ...
- JS做动态表格
在后台将数据发送过来后,你需要将这些数据做成表格,实现一般表格管理功能 例如这种数据格式, 首先要创建table 在table中添加thead 在thead中添加tr 循环数组,且创建开头的inpu ...
- K2 BPM_加班党们,说好不哭还是说好不秃?_流程管理
早上经过财务小陈的办公桌 看到她正边看手机边默默流泪 诶?这不是这两天刷屏的 周杰伦的<说好不哭>吗 小陈你怎么哭啦,这歌让你想到前男友了吗? ...... (摇头) 小陈擦擦眼泪 唱起了 ...
- python3之面向对象编程理解
面向对象主要有三个特征:封装,继承,多态度. 一.封装 定义类语 class Animal(): class为定义类的关键字,后面跟名字(): python命名规范建议:类一般首字母单词大写,属性变量 ...