POJ 3150 Cellular Automaton --矩阵快速幂及优化
题意:给一个环,环上有n块,每块有个值,每一次操作是对每个点,他的值变为原来与他距离不超过d的位置的和,问k(10^7)次操作后每块的值。
解法:一看就要化为矩阵来做,矩阵很好建立,大白书P157页有讲,大概为:
[1 1 0 .. 0 1]
[1 1 1 .. .. 0]
...
[1 1 .. .. .. 1] 的循环矩阵,可以证明,循环矩阵的乘积还是循环矩阵,且循环矩阵的性质: a[i][j] = a[i-1][j-1] (循环的) ,所以,我们每次矩阵相乘只需要算出第一行,余下的不需要通过矩阵乘法来算出,直接根据规律推出,这样,矩阵乘法的复杂度就降到了O(n^2),加上快速幂,总复杂度O(n^2log(k))。
注意:中间相乘的时候a[i][k]*b[k][j]可能会超过int范围,要加一个long long,否则会WA.
代码:(6000+ ms 也是醉了。。)
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#define SMod m
#define ll long long
using namespace std; int n,m,k,d;
struct Matrix
{
int m[][];
Matrix()
{
memset(m,,sizeof(m));
for(int i=;i<=n;i++)
m[i][i] = ;
}
}; Matrix Mul(Matrix a,Matrix b)
{
Matrix res;
int i,j,k;
for(j=;j<=n;j++)
{
res.m[][j] = ;
for(k=;k<=n;k++)
res.m[][j] = (res.m[][j]+(ll)a.m[][k]*b.m[k][j]%SMod + SMod)%SMod;
}
for(i=;i<=n;i++)
{
for(j=;j<=n;j++)
res.m[i][j] = res.m[i-][j-];
res.m[i][] = res.m[i-][n];
}
return res;
} Matrix fastm(Matrix a,int b)
{
Matrix res;
while(b)
{
if(b&)
res = Mul(res,a);
a = Mul(a,a);
b >>= ;
}
return res;
} Matrix Muti(Matrix a,Matrix b)
{
Matrix res;
int i,j,k;
for(i=;i<=n;i++)
{
res.m[i][] = ;
for(k=;k<=n;k++)
res.m[i][] = (res.m[i][]+(ll)a.m[i][k]*b.m[k][]%SMod + SMod)%SMod;
}
return res;
} int main()
{
int i,j;
while(scanf("%d%d%d%d",&n,&m,&d,&k)!=EOF)
{
Matrix R;
memset(R.m,,sizeof(R.m));
for(i=;i<=n;i++)
scanf("%d",&R.m[i][]),R.m[i][]%=SMod;
Matrix A;
for(i=;i<=d+;i++)
A.m[][i] = ;
for(i=n;i>=n-d+;i--)
A.m[][i] = ;
for(i=;i<=n;i++)
{
for(j=;j<=n;j++)
A.m[i][j] = A.m[i-][j-];
A.m[i][] = A.m[i-][n];
}
/*for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(min(abs(i-j),n-abs(i-j)) <= d)
A.m[j][i] = 1;
else
A.m[j][i] = 0;
}
}*/
Matrix ans = fastm(A,k);
ans = Muti(ans,R);
for(i=;i<=n;i++)
printf("%d%c",ans.m[i][]%m,i==n?'\n':' ');
}
return ;
}
POJ 3150 Cellular Automaton --矩阵快速幂及优化的更多相关文章
- [POJ 3150] Cellular Automaton (矩阵高速幂 + 矩阵乘法优化)
Cellular Automaton Time Limit: 12000MS Memory Limit: 65536K Total Submissions: 3048 Accepted: 12 ...
- POJ 3150 Cellular Automaton(矩阵高速幂)
题目大意:给定n(1<=n<=500)个数字和一个数字m,这n个数字组成一个环(a0,a1.....an-1).假设对ai进行一次d-step操作,那么ai的值变为与ai的距离小于d的全部 ...
- poj 3070 && nyoj 148 矩阵快速幂
poj 3070 && nyoj 148 矩阵快速幂 题目链接 poj: http://poj.org/problem?id=3070 nyoj: http://acm.nyist.n ...
- poj 3070 Fibonacci(矩阵快速幂,简单)
题目 还是一道基础的矩阵快速幂. 具体的居者的幂公式我就不明示了. #include<stdio.h> #include<string.h> #include<algor ...
- POJ 3070 Fibonacci(矩阵快速幂)
题目链接 题意 : 用矩阵相乘求斐波那契数的后四位. 思路 :基本上纯矩阵快速幂. #include <iostream> #include <cstring> #includ ...
- poj 2778 AC自动机+矩阵快速幂
题目链接:https://vjudge.net/problem/POJ-2778 题意:输入n和m表示n个病毒,和一个长为m的字符串,里面只可以有'A','C','G','T' 这四个字符,现在问这个 ...
- Scout YYF I POJ - 3744(概率dp + 矩阵快速幂)
题意: 一条路上有n个地雷,你从1开始走,单位时间内有p的概率走一步,1-p的概率走两步,问安全通过这条路的概率 解析: 很容易想到 dp[i] = p * dp[i-1] + (1 - p) * d ...
- POJ 3070 Fibonacci 【矩阵快速幂】
<题目链接> Description In the Fibonacci integer sequence, F0 = 0, F1 = 1, and Fn = Fn − 1 + Fn − 2 ...
- POJ 3734 Blocks (矩阵快速幂)
题目链接 Description Panda has received an assignment of painting a line of blocks. Since Panda is such ...
随机推荐
- ningx配置ModSecurity重启出现兼容性问题:ModSecurity: Loaded PCRE do not match with compiled!的解决方法
nginx开启错误日志,然后重启nginx,出现如下信息: 2016/12/03 09:40:38 [notice] 18858#0: ModSecurity for nginx (STABLE)/2 ...
- 「C语言」Windows+EclipseCDT下的C语言开发环境准备
之前写过一篇 「C语言」在Windows平台搭建C语言开发环境的多种方式 ,讨论了如何在Windows下用DEV C++.EclipseCDT.VisualStudio.Sublime Test.Cl ...
- Button 对 TreeView1 所有节点的全选
protected void Button1_Click(object sender, EventArgs e) { for (int i = 0; i < this.Tre ...
- 关于oracle-12514错误的修改方法
原因1: 打开文件"<OracleHome>/network/admin/listener.ora",添加 (SID_DESC = (GLOBAL_DB ...
- Device Channels in SharePoint 2013
[FROM:http://blog.mastykarz.nl/device-channels-sharepoint-2013/] One of the new features of SharePoi ...
- linux中fork()函数详解(原创!!实例讲解) (转载)
一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源.fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程, 也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不 ...
- tableview直接滚动至最后一行的问题
tableview直接滚动至最后一行 类似聊天界面,tableview应该直接显示在最后一行,并且不应该有滚动的出现. 在网上查了很久,直接滚动至最后一行很容易实现,有两种方法比较好. 1. 调用sc ...
- 【原】结构体包含CString类型成员变量出错的原理
问题如下:我定义了如下的一个结构体: typedef struct{ CString csText;}MyStruct; 并有如下的程序段1:MyStruct * p=NULL;p=(MyStru ...
- iOS设计模式-单例模式
(一)什么是单例模式(Singleton) 单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点 *最初的定义是在<设计模式>(Addison-Wesley)中 解读 1> ...
- Objective-C的IO流