UVALive 3704 细胞自动机 矩阵快速幂
是时候要做做数学类的题目了
这属于比较简单的矩阵快速幂了,因为有个已知的矩阵循环的结论,所以为了节约时空,只需要保留一行即可,这个稍微有点难写,也不是难写,主要是注意细节。其他的矩阵快速幂一下即可
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 505
#define ll long long
using namespace std;
struct Mat
{
ll mat[][N];
}E,Z,O;
ll n,m,d,k;
void init()
{
memset(E.mat,,sizeof E.mat);
for (int i=;i<n;i++)
E.mat[i][i]=;
memset(O.mat,,sizeof O.mat);
int tmp=;
for (int j=-d;tmp<*d+;j++,tmp++){
if (j<) j+=n;
if (j>=n) j%=n;
O.mat[][j]=;
}
// cout<<"!!!"<<endl;
// for (int i=0;i<n;i++)
// cout<<O.mat[0][i]<<" ";
// cout<<endl;
}
Mat operator *(Mat a,Mat b)
{
Mat c=Z;
int i,j;
for (i=;i<n;i++){
int cur=n-i;
for (j=;j<n;j++){
if (cur>=n) cur%=n;//因为是循环矩阵,由第一行即可推得其他列的情况
c.mat[][i]+=a.mat[][j]*b.mat[][cur];
cur++;
if (c.mat[][i]>=m) c.mat[][i]%=m;
}
}
return c;
}
Mat operator ^(Mat a,ll x)
{
Mat c=E;
for (;x;x>>=){
if (x&){
c=c*a;
}
a=a*a;
}
return c;
}
ll A[N],B[N];
int main()
{
memset(Z.mat,,sizeof Z.mat);
while (scanf("%lld%lld%lld%lld",&n,&m,&d,&k)!=EOF)
{
init();
Mat ans=O^k;
// for (int i=0;i<n;i++)
// cout<<ans.mat[0][i]<<" ~ ";
// cout<<endl;
for (int i=;i<n;i++)
scanf("%lld",&A[i]);
for (int i=;i<n;i++){
int cur=n-i;
B[i]=;
for (int j=;j<n;j++){
if (cur>=n) cur%=n;
B[i]+=ans.mat[][cur]*A[j];
cur++;
if (B[i]>=m) B[i]%=m;
}
}
printf("%lld",B[]);
for (int i=;i<n;i++)
printf(" %lld",B[i]);
printf("\n");
}
return ;
}
UVALive 3704 细胞自动机 矩阵快速幂的更多相关文章
- UVaLive 7361(矩阵快速幂)
题意:矩阵快速幂求斐波那契数列. 分析:
- LA 3704细胞自动机——循环矩阵&&矩阵快速幂
题目 一个细胞自动机包含 $n$ 个格子,每个格子的取值为 $0 \sim m-1$.给定距离 $d$,则每次操作是将每个格子的值变为到它的距离不超过 $d$ 的所有格子的在操作之前的值的和除以 $m ...
- UVaLive 3704 Cellular Automaton (循环矩阵 + 矩阵快速幂)
题意:一个细胞自动机包含 n 个格子,每个格子取值是 0 ~ m-1,给定距离,则每次操作后每个格子的值将变成到它距离不超过 d 的所有格子在操作之前的值之和取模 m 后的值,其中 i 和 j 的距离 ...
- UVaLive 7361 Immortal Porpoises (矩阵快速幂)
题意:求Fibonacci的第 n 项. 析:矩阵快速幂,如果不懂请看http://www.cnblogs.com/dwtfukgv/articles/5595078.html 是不是很好懂呢. 代码 ...
- 矩阵快速幂 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 ...
随机推荐
- idea-plugin-easycode
1.背景 在练习使用mybatis-generator时候,无意间看到博文esaycode(代码神器),https://www.jianshu.com/p/e4192d7c6844,试验完,感觉这个工 ...
- linux安装postgresql数据库
本文提供数据库安装脚本,有部分需要优化,就是脚本中的方法执行存在前后依赖,但是代码里面没有对上一个执行结果进行判断,如果提供的路径和安装包没有问题,脚本能够正常执行 #!/bin/bash # ins ...
- springboot创建bean
springboot创建bean的方式有两种: 1.直接类上加注解@Component@Controller@Service ... 2.使用@Bean注解配合@Configuration注解 区别是 ...
- DataFoundation比赛总结
2018.3.20号左右,因为研究生的数据挖掘课程的老师要求我们集体参加一个比赛 ,所以在比赛参与时间.比赛难度和比赛类型的几种条件下,我们选择了2018平安产险数据建模大赛-驾驶行为预测驾驶风险比赛 ...
- (八)微信小程序---获取定位信息chooseLocation
微信小程序---获取定位信息 chooseLocation wxml <view bindtap="getlocalPath">{{localPath}}</v ...
- P1056 组合数的和
P1056 组合数的和 转跳点:
- HDU 5504:GT and sequence
GT and sequence Accepts: 95 Submissions: 1467 Time Limit: 2000/1000 MS (Java/Others) Memory Limi ...
- python基础(变量,字符串,列表,元组)
#列表的操作list1 = ['wuqiang','lichang','changhao'] #列表的定义print(list1) #操作列表print(list1[-1]) #操作列表的最后一位li ...
- Emacs: 设置窗口标题格式
Emacs默认的窗口标题常常比较简单,例如我的默认标题是"emacs@ubuntu".如果想要在标题中显示更多的信息,我们可以对它进行一些设置.由于Emacs的可扩展性,这种修改实 ...
- 048-PHP定义常量
<?php define('NUM',123); //定义常量NUM echo NUM; //输出NUM的值 define('STR','ABC',TRUE); //定义常量STR并设置大小写不 ...