LA 3704细胞自动机——循环矩阵&&矩阵快速幂
题目
一个细胞自动机包含 $n$ 个格子,每个格子的取值为 $0 \sim m-1$。给定距离 $d$,则每次操作是将每个格子的值变为到它的距离不超过 $d$ 的所有格子的在操作之前的值的和除以 $m$ 的余数。给出 $n, m, d, k$ 和自动机各个格子的初始值。你的任务是计算 $k$ 次操作以后各格子的值。($1 \leq n\leq 500, 1 \leq m\leq 10^6, 0 \leq d\leq n/2, 1\leq k\leq 10^7$).
分析
如果我们把 $t$ 次操作以后的各格子值写成列向量 $v_t$,不难发现 $v_{t+1}$ 的每一维都是 $v_t$ 中各维的线性组合,其中的加法和乘法都是在模 $m$ 的剩余系中完成。
每次操作相当于乘以一个 $n \times n $ 矩阵,直接使用矩阵快速幂的复杂度为 $O(n^3logk)$,
由于这里的矩阵比较特殊,是循环矩阵(从第二行开始每一行都是上一行循环右移),
可以证明,两个循环矩阵的乘积仍然为循环矩阵。
因此在存储时只需保存第一行,而计算矩阵乘法时也只需算出第一行即可。这样,矩阵乘法的时间复杂度降为 $O(n^2)$。总时间降为 $O(n^2log k)$,可以承受。
用FFT优化的话可做到 $0(nlognlogk)$.
$$\begin{bmatrix}
1 & 1 & 0 & 0 & 1\\
1 & 1 & 1 & 0 & 0 \\
0 & 1& 1& 1 & 0\\
0 & 0 & 1 & 1 & 1\\
1 & 0 & 0 & 1 & 1
\end{bmatrix} \times
\begin{bmatrix}
1 & 1 & 0 & 0 & 1\\
1 & 1 & 1 & 0 & 0 \\
0 & 1& 1& 1 & 0\\
0 & 0 & 1 & 1 & 1\\
1 & 0 & 0 & 1 & 1
\end{bmatrix} =
\begin{bmatrix}
3 & 2 & 1 & 1 & 2\\
2 & 3 & 2 & 1 & 1\\
1 & 2 & 3 & 2 & 1\\
1 & 1 & 2 & 3 & 2\\
2 & 1 & 1 & 2 & 3
\end{bmatrix}$$
#include<cstdio>
#include<cstring>
using namespace std; typedef long long ll;
const int maxn = +;
struct matrix
{
int n;
ll mat[maxn];
matrix(){
memset(mat, , sizeof(mat));
}
};
ll n, p, d, k;
ll a[maxn]; matrix mul(matrix A, matrix B) //矩阵相乘,这里A=B,且都是n x n的方阵
{
matrix ret;
ret.n = A.n;
for(int i = ;i < A.n;i++)
for(int j = ;j < B.n;j++) ret.mat[i] = (ret.mat[i] + A.mat[j] * B.mat[(j-i+A.n)%A.n]) % p;
return ret;
} matrix mpow(matrix A, int n)
{
matrix ret;
ret.n = A.n;
ret.mat[]=;
while(n)
{
if(n & ) ret = mul(ret, A);
A = mul(A, A);
n >>= ;
}
return ret;
} int main()
{
while(scanf("%lld%lld%lld%lld", &n, &p,&d, &k) == )
{
for(int i = ;i < n;i++) scanf("%lld", &a[i]);
matrix A;
A.n = n;
for(int i = ;i <= d;i++) A.mat[i] = ;
for(int i = n-d; i < n;i++) A.mat[i] = ; A = mpow(A, k); for(int i = ;i < A.n;i++)
{
ll tmp = ;
for(int j = ;j < A.n;j++) tmp = (tmp + A.mat[(j-i+n) % n] * a[j]) % p;
printf("%lld%c", tmp, i == n- ? '\n' : ' ');
}
}
return ;
}
记得开 long long !!
参考链接: https://vjudge.net/status/#un=&OJId=UVALive&probNum=3704&res=0&orderBy=run_id&language=
LA 3704细胞自动机——循环矩阵&&矩阵快速幂的更多相关文章
- Luogu 1349 广义斐波那契数列(递推,矩阵,快速幂)
Luogu 1349 广义斐波那契数列(递推,矩阵,快速幂) Description 广义的斐波那契数列是指形如\[A_n=p*a_{n-1}+q*a_{n-2}\]的数列.今给定数列的两系数p和q, ...
- 洛谷 P4910 帕秋莉的手环 矩阵乘法+快速幂详解
矩阵快速幂解法: 这是一个类似斐波那契数列的矩乘快速幂,所以推荐大家先做一下下列题目:(会了,差不多就是多倍经验题了) 注:如果你不会矩阵乘法,可以了解一下P3390的题解 P1939 [模板]矩阵加 ...
- Qbxt 模拟赛 Day4 T2 gcd(矩阵乘法快速幂)
/* 矩阵乘法+快速幂. 一开始迷之题意.. 这个gcd有个规律. a b b c=a*x+b(x为常数). 然后要使b+c最小的话. 那x就等于1咯. 那么问题转化为求 a b b a+b 就是斐波 ...
- 【BZOJ-1009】GT考试 KMP+DP+矩阵乘法+快速幂
1009: [HNOI2008]GT考试 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 2745 Solved: 1694[Submit][Statu ...
- 矩阵乘法快速幂 codevs 1574 广义斐波那契数列
codevs 1574 广义斐波那契数列 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题目描述 Description 广义的斐波那契数列是指形如 ...
- 矩阵乘法快速幂 codevs 1732 Fibonacci数列 2
1732 Fibonacci数列 2 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description 在“ ...
- BZOJ-1875 HH去散步 DP+矩阵乘法快速幂
1875: [SDOI2009]HH去散步 Time Limit: 20 Sec Memory Limit: 64 MB Submit: 1196 Solved: 553 [Submit][Statu ...
- BZOJ-2326 数学作业 矩阵乘法快速幂+快速乘
2326: [HNOI2011]数学作业 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 1564 Solved: 910 [Submit][Statu ...
- BZOJ-2875 随机数生成器 矩阵乘法快速幂+快速乘
题目没给全,吃X了... 2875: [Noi2012]随机数生成器 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 1479 Solved: 829 ...
随机推荐
- unexpected end of file while looking for precompiled headerdirective Add directive to 'stdafx.h' or rebuild precompiled header错误
解决方式: 项目工程右键->propertity(属性),选择不用于预编译头 原因: C++的编译过程如下: 当头文件很多时,预编译过程需要耗费大量时间,为了减少重复编译的次数,C和C++提供了 ...
- 使用PHP开发HR系统(6)
本节讲述如何连接Postgre数据库并查询与显示数据. ==================================================================== ...
- TextField 、 FTE、 TLF 的使用情景和简单说明
作者:tiangej 来源:CSDN 原文:https://blog.csdn.net/tiangej/article/details/16859239 版权声明:本文为博主原创文章,转载请附上博文链 ...
- JMeter中文乱码的解决
对于JMeter中文乱码分为两部分: 1.请求(request):由于引用了csv文件当csv文件编码与JMeter不统一可能造成服务器收到数据的中文乱码 2.返回(response):由于服务器返回 ...
- JNA的应用
一.了解JNA之前,我们先了解一下JNA的前身JNI(Java Native Interface):通过使用 Java本地接口书写程序,可以确保代码在不同的平台上方便移植. [1] 从Java1.1 ...
- C# vb .net实现移除透明度效果
在.net中,如何简单快捷地实现Photoshop滤镜组中的移除透明度效果呢?答案是调用SharpImage!专业图像特效滤镜和合成类库.下面开始演示关键代码,您也可以在文末下载全部源码: 设置授权 ...
- Java开发环境搭建(二):环境变量配置
如果不配置环境变量,java 命令就只能在 bin 目录下才能使用,而且很多Java软件也需要在配置JAVA_HOME和PATH的状态下才能运行.为了在任何目录下都可以使用 java 命令.保证程序正 ...
- 【CH1809】匹配统计(KMP)
题目链接 摘自https://www.cnblogs.com/wyboooo/p/9829517.html 用KMP先求出以a[i]为结尾的前缀与b匹配的最长长度. 比如 f[i] = j,就表示a[ ...
- CentOS下安装mysql-server提示No package mysql-server avaliable
出现这个原因是CentOS使用mariadb-server代替掉了mysql-server,因此如果想使用mysql-server需要先更新仓库地址,使用以下命令: wget http://repo. ...
- Oracle 检索数据(查询数据、select语句)
用户对表或视图最常进行的操作就是检索数据,检索数据可以通过 select 语句来实现,该语句由多个子句组成,通过这些子句完成筛选.投影和连接等各种数据操作,最终得到想要的结果. 语法: select ...