POJ3150—Cellular Automaton(循环矩阵)
题目链接:http://poj.org/problem?id=3150
题目意思:有n个数围成一个环,现在有一种变换,将所有距离第i(1<=i<=n)个数小于等于d的数加起来,对m取余,现在要求将所有的数都变换k次,得到的n个数的值。
思路:构造一个循环矩阵,以下这个矩阵是以样例1为例的循环矩阵。
我们发现n尽然达到了500,复杂度是n^3logk,过不了,我们发现这个矩阵长得很奇葩,每一行都是上一行后移一位得到,所以我们每个矩阵可以n^2算出一行,然后通过平移得到全部的矩阵。从而把n^3的矩阵乘法变成n^2,复杂度是n^2logk,就可以AC了,其他没有什么奇怪的操作。第一道循环矩阵题,算是涨姿势了,循环矩阵乘法模板记住了。
代码:
//Author: xiaowuga
#include<iostream>
#include<cstring>
#define maxx INT_MAX
#define minn INT_MIN
#define inf 0x3f3f3f3f
#define N 505
using namespace std;
long long MOD;
typedef long long ll;
long long n,size;//第n项,矩阵大小
long long f[];
struct Matrix{
long long mat[N][N];
void clear(){
memset(mat,,sizeof(mat));
}
Matrix operator * (const Matrix & m) const{
Matrix tmp;
tmp.clear();
for(int i=;i<size;i++){
for(int j=;j<size;j++){
tmp.mat[][i]+=mat[][j]*m.mat[j][i]%MOD;
}
tmp.mat[][i]%=MOD;
}
for(int i=;i<size;i++){
for(int j=;j<size;j++)
tmp.mat[i][j]=tmp.mat[i-][(j+size-)%size];
}
return tmp;
}
}M,ANS;
Matrix ans;
void POW(Matrix m,ll k){
memset(ans.mat,,sizeof(ans.mat));
for(int i=;i<size;i++) ans.mat[i][i]=;
while(k){
if(k&) ans=ans*m;
k/=;
m=m*m;
}
long long sum;
for(int i=;i<size;i++){
sum=;
for(int j=;j<size;j++){
sum+=ans.mat[i][j]*f[j]%MOD;
}
if(i==) cout<<sum%MOD;
else cout<<" "<<sum%MOD;
}
cout<<endl;
}
int main() {
ios::sync_with_stdio(false);cin.tie();
long long d;
while(cin>>size>>MOD>>d>>n){
M.clear();
for(int i=;i<size;i++) cin>>f[i];
for(int i=;i<size;i++){
M.mat[i][i]=;
for(int j=;j<=d;j++){
M.mat[i][(i+j+size)%size]=;
M.mat[i][(i-j+size)%size]=;
}
}
for(int i=;i<size;i++){
for(int j=;j<size;j++) cout<<M.mat[i][j]<<' ';
cout<<endl;
}
POW(M,n);
}
return ;
}
POJ3150—Cellular Automaton(循环矩阵)的更多相关文章
- UVA 1386 - Cellular Automaton(循环矩阵)
UVA 1386 - Cellular Automaton option=com_onlinejudge&Itemid=8&page=show_problem&category ...
- UVaLive 3704 Cellular Automaton (循环矩阵 + 矩阵快速幂)
题意:一个细胞自动机包含 n 个格子,每个格子取值是 0 ~ m-1,给定距离,则每次操作后每个格子的值将变成到它距离不超过 d 的所有格子在操作之前的值之和取模 m 后的值,其中 i 和 j 的距离 ...
- POJ 3150 Cellular Automaton(矩阵快速幂)
Cellular Automaton Time Limit: 12000MS Memory Limit: 65536K Total Submissions: 3504 Accepted: 1421 C ...
- 【POJ】3150 Cellular Automaton(矩阵乘法+特殊的技巧)
http://poj.org/problem?id=3150 这题裸的矩阵很容易看出,假设d=1,n=5那么矩阵是这样的 1 1 0 0 1 1 1 1 0 0 0 1 1 1 0 0 0 1 1 1 ...
- POJ 3150 Cellular Automaton(矩阵乘法+二分)
题目链接 题意 : 给出n个数形成环形,一次转化就是将每一个数前后的d个数字的和对m取余,然后作为这个数,问进行k次转化后,数组变成什么. 思路 :下述来自here 首先来看一下Sample里的第一组 ...
- LA 3704 (矩阵快速幂 循环矩阵) Cellular Automaton
将这n个格子看做一个向量,每次操作都是一次线性组合,即vn+1 = Avn,所求答案为Akv0 A是一个n*n的矩阵,比如当n=5,d=1的时候: 不难发现,A是个循环矩阵,也就是将某一行所有元素统一 ...
- [POJ 3150] Cellular Automaton (矩阵高速幂 + 矩阵乘法优化)
Cellular Automaton Time Limit: 12000MS Memory Limit: 65536K Total Submissions: 3048 Accepted: 12 ...
- POJ - 3150 :Cellular Automaton(特殊的矩阵,降维优化)
A cellular automaton is a collection of cells on a grid of specified shape that evolves through a nu ...
- POJ 3150 Cellular Automaton(矩阵高速幂)
题目大意:给定n(1<=n<=500)个数字和一个数字m,这n个数字组成一个环(a0,a1.....an-1).假设对ai进行一次d-step操作,那么ai的值变为与ai的距离小于d的全部 ...
随机推荐
- 用JIRA管理你的项目
https://blog.csdn.net/gaowenhui2008/article/details/70241657 (一) JIRA环境搭建
- 每日英语:Online Education a New Frontier in China
In a country as obsessed with education as China, it makes sense that online teaching has huge poten ...
- Linux下编译C++程序遇到错误:undefined reference to `*::*
“undefined reference to”的意思是,该函数未定义. 如果使用的是g++,有以下检查方案: 如果提示未定义的函数是某个库的函数.检查库是否已经安装,并在编译命令中采用-l和-L参数 ...
- 0071 CentOS_Tomcat访问文件名包含中文的文件出现404错误
访问CentOS+Tomcat下的,文件名包含中文的文件出现404错误 修改:apache-tomcat-7.0.78/conf/server.xml <Connector port=" ...
- cocos2dx3.2升级Android5的坑
虽然已经转到服务端,但是对客户端的事情,偶尔还看看.公司的游戏用的是cocos2dx 3.2的版本, 然而在Android 5 上却无法运行. 先是没有触摸事件. 在stackoverflow上看到, ...
- google cloud之停止任务
1.点击侧边栏:ML Engine -> Jobs 2.选择对应的任务,点击stop
- HBase和ZooKeeper
HBase和ZooKeeper HBase内置有ZooKeeper,也可以使用外部ZooKeeper. 让HBase使用一个已有的不被HBase托管的Zookeep集群,需要设置 conf/hbase ...
- java--Struts中请求的过程
一个请求在Struts2框架中的处理步骤: a) 客户端初始化一个指向Servlet容器的请求: b) 根据Web.xml配置,请求首先经过ActionContextCleanUp过滤器,其为可选过滤 ...
- ]flexslider 中文文档 使用教程 参数手册
[原创]flexslider 中文文档 使用教程 参数手册 要改前人用的flexslider功能,但苦于找不到详细的文档教程,折磨了好久……(所以我才说不爱乱用插件) 为了福利下之后也苦于这个问题 ...
- 用newInstance与用new是区别的
用newInstance与用new是区别的,区别在于创建对象的方式不一样,前者是使用类加载机制,那么为什么会有两种创建对象方式?这个就要从可伸缩.可扩展,可重用等软件思想上解释了.Java中工厂模式经 ...