思路:

  1. 首先 先普及一个性质: 循环矩阵*循环矩阵=循环矩阵

    由于此题是距离小于d的都加上一个数。

    那么 构造矩阵的时候 我们发现 诶呦 这是个循环矩阵

    看看数据范围 n^2log(k)可以过。

    那就把这个矩阵改一改。

    因为这是个循环矩阵, 所以呢 只用保存一行就可以了。

    每回做乘法的时候只做第一行的乘法。

    for(i) for(j) temp[i]+=a[j]*b[(i+j)%n];

    就这么着 搞搞就能过了。

  2. (好像可以用FFT? 表示并不会)

// by SiriusRen
#include <cstdio>
#include <cstring>
#define LL long long
using namespace std;
long long f[666],co[666],c[666];
int n,m,d,k;
void mul(LL *a,LL *b){
memset(c,0,sizeof(c));
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
c[i]+=a[j]*b[(i+j)%n];
for(int i=0;i<n;i++)b[i]=c[i]%m;
}
int main(){
scanf("%d%d%d%d",&n,&m,&d,&k);
for(int i=0;i<n;i++)scanf("%lld",&f[i]);
for(int i=0;i<=d;i++)co[i]=co[n-i]=1;
while(k){
if(k&1)mul(co,f);
mul(co,co),k>>=1;
}
for(int i=0;i<n;i++)printf("%lld ",f[i]);
}

// by SiriusRen
#include <cstdio>
#define LL long long
#define f(Q,R) for(int Q=0;Q<R;Q++)
using namespace std;
LL f[666],co[666],c[666];
int n,m,d,k;
void mul(LL *a,LL *b){
f(i,n)c[i]=0;
f(i,n)f(j,n)c[(i+j)%n]+=a[i]*b[j];
f(i,n)b[i]=c[i]%m;
}
int main(){
scanf("%d%d%d%d",&n,&m,&d,&k);
f(i,n)scanf("%lld",&f[i]);
f(i,d+1)co[i]=co[n-i]=1;
while(k){
if(k&1)mul(co,f);
mul(co,co),k>>=1;
}
f(i,n)printf("%lld ",f[i]);
}



Code length能进前三的存在哈哈哈

POJ 3150 循环矩阵的应用的更多相关文章

  1. POJ 3150 Cellular Automaton --矩阵快速幂及优化

    题意:给一个环,环上有n块,每块有个值,每一次操作是对每个点,他的值变为原来与他距离不超过d的位置的和,问k(10^7)次操作后每块的值. 解法:一看就要化为矩阵来做,矩阵很好建立,大白书P157页有 ...

  2. POJ 3150 Cellular Automaton(矩阵快速幂)

    Cellular Automaton Time Limit: 12000MS Memory Limit: 65536K Total Submissions: 3504 Accepted: 1421 C ...

  3. BZOJ 4204 && BZOJ 2510 循环矩阵

    n^3logn非常显然.所以要用一种因为这个矩阵是一个循环矩阵,所以只要知道第一行就可以知道所有行了. C[i][j]=C[i-1][j-1]; #include <iostream> # ...

  4. POJ3150—Cellular Automaton(循环矩阵)

    题目链接:http://poj.org/problem?id=3150 题目意思:有n个数围成一个环,现在有一种变换,将所有距离第i(1<=i<=n)个数小于等于d的数加起来,对m取余,现 ...

  5. LA 3704 (矩阵快速幂 循环矩阵) Cellular Automaton

    将这n个格子看做一个向量,每次操作都是一次线性组合,即vn+1 = Avn,所求答案为Akv0 A是一个n*n的矩阵,比如当n=5,d=1的时候: 不难发现,A是个循环矩阵,也就是将某一行所有元素统一 ...

  6. bzoj 2510: 弱题 循环矩阵

    2510: 弱题 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 124  Solved: 61[Submit][Status][Discuss] De ...

  7. UVA 1386 - Cellular Automaton(循环矩阵)

    UVA 1386 - Cellular Automaton option=com_onlinejudge&Itemid=8&page=show_problem&category ...

  8. hihocoder 1388 fft循环矩阵

    #1388 : Periodic Signal 时间限制:5000ms 单点时限:5000ms 内存限制:256MB 描述 Profess X is an expert in signal proce ...

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

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

随机推荐

  1. javascript中经典继承的兼容写法

    function create(obj) { // 2.1 判断浏览器支持不支持 Object.create // 如果支持,直接使用 Object.create // 如果不支持,自己实现 if(O ...

  2. Windows Server2008上安装VS2008出错及解决办法

    作者:朱金灿 来源:http://blog.csdn.net/clever101 win server 2008安装vs2008后报错,如下图: 然后到网上找了一种解决办法: (1)打开服务器管理器 ...

  3. python版本及ML库

    一:关于Python版本的选择问题 关于Python的选择问题:要看学术界能不能把科学库迁移到Python3. 1:多个版本共用: 最近发现SciPy的最高版本是3.2,只能是退而求其次,不使用最新版 ...

  4. 函数GROUP_CONCAT

    这不得不说是mysql中一个特别好用的函数,之前生写这种确实好麻烦..感谢mysql有了这么好的函数..嘿嘿 举个例子吧. s_student 表 stuinfo表 sql如下: ok,简单粗暴,就这 ...

  5. Angular 通过constant(name,value),value(name,value)创建服务

    区别: constant()可以将已经存在的变量值注册为服务,并将其注入到应用的其他部分中,他的value可以是值,也可以是对象.通过他来配置数据,也就是说可以在config里注入,但是他是不可以修改 ...

  6. 02--linux操作系统基础学习笔记

    linux是一种操作系统. 嵌入式系统是以应用为中心的,以计算机技术为基础并且软硬件可剪裁,专用计算机系统. 内核下载网站 https://www.kernel.org/ https://www.ke ...

  7. RabbitMQ学习之spring配置文件rabbit标签的使用

    下面我们通过一个实例看一下rabbit的使用. 1.实现一个消息监听器ReceiveMessageListener.Java package org.springframework.amqp.core ...

  8. java中的标识符

    程序员自己定义的名称,例如类名,方法名,变量等等 标识符命名的规则 1.只能由字母(a-z,A-Z),数字(0-9),下划线(_)和美元符号($)组成 2.不能以数字开头 3.不能与关键字重名 4.严 ...

  9. Brain Network (hard) CodeForces - 690C 简单倍增 + 一些有趣的推导

    Code: #include<cstdio> #include<cstring> #include<algorithm> using namespace std; ...

  10. linux下查看mysql版本的四种方法

    Linux查看MySQL版本的四种方法 1 在终端下执行 mysql -V 2 在help中查找 mysql --help |grep Distrib 3 在mysql 里查看 select vers ...