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 ...
随机推荐
- ajax案例源码
html文件中demo2_index.html ---------------------------------------------------------------------------- ...
- 一些经典===>>用SQL语句操作数据
用SQL语句操作数据 结构化查询语言(Structured Query Language)简称SQL(发音:/ˈes kjuː ˈel/ "S-Q-L"),是一种特殊目的的编程语言 ...
- Linux守护进程的编程实现(转)
http://blog.csdn.net/zg_hover/article/details/2553321 http://blog.csdn.net/kongdefei5000/article/det ...
- gulp入坑系列(1)——安装gulp
前言 好吧,我承认我是为了搞定Sass编译CSS文件的问题,迷一样的着手入gulp的坑,sass和gulp的爬坑历程大概会一起更新.然后感觉这里windows和mac的流程差不多,不过mac的通常 ...
- 破解入门【OllyDebug爆破程序】
逆向破解这块我也是个刚起步的小菜,入门都还算不上吧,看了点基础教程,先动手练习一下增加点兴趣.嘿嘿 工具: peid //查壳工具 OllyDebug //反汇编.动态调试工具 ...
- Android 5中不同效果的Toast
一.运行的结果 二.主要的代码 package com.otn.android.toast; import java.util.Timer; import java.util.TimerTask; i ...
- swift GCD使用指南
swift GCD使用指南 Grand Central Dispatch(GCD)是异步执行任务的技术之一.一般将应用程序中记述的线程管理用的代码在系统级中实现.开发者只需要定义想执行的任务并追加到适 ...
- 【原】macbook不睡眠的排查与解决
这几天突然发现手上的macbook pro笔记本不能睡眠了,就算合上盖子也是如此.有没有进入睡眠可以观察右下角的呼吸灯,如果呼吸灯常亮则说明有问题.所谓“工欲善其事,必先利其器”,攻城狮想敲更多更好的 ...
- 网络开始---多线程---NSThread-02-线程状态(了解)(三)
#import "HMViewController.h" @interface HMViewController () @property (nonatomic, strong) ...
- iOS 公司开发者账号申请
苹果开发者账号分三种. 个人账号:个人申请用于开发苹果app所使用的账号,仅限于个人使用,申请比较容易,$99. 公司账号:以公司的名义申请的开发者账号,用于公司内部的开发者共用,$99. 企业账号: ...