是时候要做做数学类的题目了

这属于比较简单的矩阵快速幂了,因为有个已知的矩阵循环的结论,所以为了节约时空,只需要保留一行即可,这个稍微有点难写,也不是难写,主要是注意细节。其他的矩阵快速幂一下即可

#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 细胞自动机 矩阵快速幂的更多相关文章

  1. UVaLive 7361(矩阵快速幂)

    题意:矩阵快速幂求斐波那契数列. 分析:

  2. LA 3704细胞自动机——循环矩阵&&矩阵快速幂

    题目 一个细胞自动机包含 $n$ 个格子,每个格子的取值为 $0 \sim m-1$.给定距离 $d$,则每次操作是将每个格子的值变为到它的距离不超过 $d$ 的所有格子的在操作之前的值的和除以 $m ...

  3. UVaLive 3704 Cellular Automaton (循环矩阵 + 矩阵快速幂)

    题意:一个细胞自动机包含 n 个格子,每个格子取值是 0 ~ m-1,给定距离,则每次操作后每个格子的值将变成到它距离不超过 d 的所有格子在操作之前的值之和取模 m 后的值,其中 i 和 j 的距离 ...

  4. UVaLive 7361 Immortal Porpoises (矩阵快速幂)

    题意:求Fibonacci的第 n 项. 析:矩阵快速幂,如果不懂请看http://www.cnblogs.com/dwtfukgv/articles/5595078.html 是不是很好懂呢. 代码 ...

  5. 矩阵快速幂 HDU 4565 So Easy!(简单?才怪!)

    题目链接 题意: 思路: 直接拿别人的图,自己写太麻烦了~ 然后就可以用矩阵快速幂套模板求递推式啦~ 另外: 这题想不到或者不会矩阵快速幂,根本没法做,还是2013年长沙邀请赛水题,也是2008年Go ...

  6. 51nod 算法马拉松18 B 非010串 矩阵快速幂

    非010串 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 如果一个01字符串满足不存在010这样的子串,那么称它为非010串. 求长度为n的非010串的个数.(对1e9+7取模) ...

  7. 51nod 1113 矩阵快速幂

    题目链接:51nod 1113 矩阵快速幂 模板题,学习下. #include<cstdio> #include<cmath> #include<cstring> ...

  8. 【66测试20161115】【树】【DP_LIS】【SPFA】【同余最短路】【递推】【矩阵快速幂】

    还有3天,今天考试又崩了.状态还没有调整过来... 第一题:小L的二叉树 勤奋又善于思考的小L接触了信息学竞赛,开始的学习十分顺利.但是,小L对数据结构的掌握实在十分渣渣.所以,小L当时卡在了二叉树. ...

  9. 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 ...

随机推荐

  1. 面试-PA和XSYX面试小结

    XSYX 1.自我介绍 2. 最近一个项目的业务和技术栈 3. 分布式锁解决库存问题 4. spring的IOC和AOP讲解 5. 类加载器层级 6.线程池核心参数和问题 7. 期待的团队是怎样的? ...

  2. CSS样式表——样式2

    样式 5)边界边框 margin:0px;                                            //外边距为0 margin:10px 0px 0px 10px;   ...

  3. 对状态字的理解 尤其是 首次检测位“/FC”的想法

    状态字 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0               BR CC1 CC0 OV OS OR STA RLO /FC 问题1 关于首次检测位& ...

  4. Gym - 101158C Distribution Center

    题意:n个传送带,传送带i运送编号为i的物品,机器人可以负责把传送带i上的物品放到传送带i + 1上,也可以把传送带i + 1上的物品放到传送带i上,机器人分布在传送带上x轴的不同位置,问每个传送带最 ...

  5. UVA - 10382 Watering Grass(几何)

    题意:有一个矩形,n个圆.已知矩形的长宽和圆的半径,问最少需多少个圆将矩形完全覆盖. 分析: 1.首先求圆与矩形的长的交点,若无交点,则一定不能对用最少的圆覆盖矩形有贡献. 2.如果两个圆与矩形相交所 ...

  6. UVA - 816 Abbott's Revenge(bfs)

    题意:迷宫从起点走到终点,进入某点的朝向不同,可以出去的方向也不同,输出最短路. 分析:因为朝向决定接下来在该点可以往哪里走,所以每个点需要有三个信息:x,y,d(坐标和进入该点的朝向),所以将起点的 ...

  7. 洛谷 P3133 [USACO16JAN]Radio Contact G

    题目传送门 解题思路: f[i][j]表示FJ走了i步,Bessie走了j步的最小消耗值.方程比较好推. 横纵坐标要搞清楚,因为这东西WA了半小时. AC代码: #include<iostrea ...

  8. BZOJ 4853 [Jsoi2016]飞机调度

    题解: 我严重怀疑语文水平(自己的和出题人的) 把航线按照拓扑关系建立DAG 然后最小路径覆盖 为什么两条首尾相接航线之间不用维护???? #include<iostream> #incl ...

  9. 十、React 父组件传来值的类型控制propTypes、父组件如果不传值defaultProps

    父组件给子组件传值时: 1.defaultProps:父子组件传值中,如果父组件调用子组件的时候不给子组件传值,可以在子组件中使用defaultProps定义的默认值: 2.propTypes:验证父 ...

  10. python 嵌套爬取网页信息

    当需要的信息要经过两个链接才能打开的时候,就需要用到嵌套爬取. 比如要爬取起点中文网排行榜的小说简介,找到榜单网址:https://www.qidian.com/all?orderId=&st ...