POJ 3150 循环矩阵的应用
思路:
首先 先普及一个性质: 循环矩阵*循环矩阵=循环矩阵
由于此题是距离小于d的都加上一个数。
那么 构造矩阵的时候 我们发现 诶呦 这是个循环矩阵
看看数据范围 n^2log(k)可以过。
那就把这个矩阵改一改。
因为这是个循环矩阵, 所以呢 只用保存一行就可以了。
每回做乘法的时候只做第一行的乘法。
for(i) for(j) temp[i]+=a[j]*b[(i+j)%n];
就这么着 搞搞就能过了。(好像可以用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 循环矩阵的应用的更多相关文章
- POJ 3150 Cellular Automaton --矩阵快速幂及优化
题意:给一个环,环上有n块,每块有个值,每一次操作是对每个点,他的值变为原来与他距离不超过d的位置的和,问k(10^7)次操作后每块的值. 解法:一看就要化为矩阵来做,矩阵很好建立,大白书P157页有 ...
- POJ 3150 Cellular Automaton(矩阵快速幂)
Cellular Automaton Time Limit: 12000MS Memory Limit: 65536K Total Submissions: 3504 Accepted: 1421 C ...
- BZOJ 4204 && BZOJ 2510 循环矩阵
n^3logn非常显然.所以要用一种因为这个矩阵是一个循环矩阵,所以只要知道第一行就可以知道所有行了. C[i][j]=C[i-1][j-1]; #include <iostream> # ...
- POJ3150—Cellular Automaton(循环矩阵)
题目链接:http://poj.org/problem?id=3150 题目意思:有n个数围成一个环,现在有一种变换,将所有距离第i(1<=i<=n)个数小于等于d的数加起来,对m取余,现 ...
- LA 3704 (矩阵快速幂 循环矩阵) Cellular Automaton
将这n个格子看做一个向量,每次操作都是一次线性组合,即vn+1 = Avn,所求答案为Akv0 A是一个n*n的矩阵,比如当n=5,d=1的时候: 不难发现,A是个循环矩阵,也就是将某一行所有元素统一 ...
- bzoj 2510: 弱题 循环矩阵
2510: 弱题 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 124 Solved: 61[Submit][Status][Discuss] De ...
- UVA 1386 - Cellular Automaton(循环矩阵)
UVA 1386 - Cellular Automaton option=com_onlinejudge&Itemid=8&page=show_problem&category ...
- hihocoder 1388 fft循环矩阵
#1388 : Periodic Signal 时间限制:5000ms 单点时限:5000ms 内存限制:256MB 描述 Profess X is an expert in signal proce ...
- UVaLive 3704 Cellular Automaton (循环矩阵 + 矩阵快速幂)
题意:一个细胞自动机包含 n 个格子,每个格子取值是 0 ~ m-1,给定距离,则每次操作后每个格子的值将变成到它距离不超过 d 的所有格子在操作之前的值之和取模 m 后的值,其中 i 和 j 的距离 ...
随机推荐
- javascript中经典继承的兼容写法
function create(obj) { // 2.1 判断浏览器支持不支持 Object.create // 如果支持,直接使用 Object.create // 如果不支持,自己实现 if(O ...
- Windows Server2008上安装VS2008出错及解决办法
作者:朱金灿 来源:http://blog.csdn.net/clever101 win server 2008安装vs2008后报错,如下图: 然后到网上找了一种解决办法: (1)打开服务器管理器 ...
- python版本及ML库
一:关于Python版本的选择问题 关于Python的选择问题:要看学术界能不能把科学库迁移到Python3. 1:多个版本共用: 最近发现SciPy的最高版本是3.2,只能是退而求其次,不使用最新版 ...
- 函数GROUP_CONCAT
这不得不说是mysql中一个特别好用的函数,之前生写这种确实好麻烦..感谢mysql有了这么好的函数..嘿嘿 举个例子吧. s_student 表 stuinfo表 sql如下: ok,简单粗暴,就这 ...
- Angular 通过constant(name,value),value(name,value)创建服务
区别: constant()可以将已经存在的变量值注册为服务,并将其注入到应用的其他部分中,他的value可以是值,也可以是对象.通过他来配置数据,也就是说可以在config里注入,但是他是不可以修改 ...
- 02--linux操作系统基础学习笔记
linux是一种操作系统. 嵌入式系统是以应用为中心的,以计算机技术为基础并且软硬件可剪裁,专用计算机系统. 内核下载网站 https://www.kernel.org/ https://www.ke ...
- RabbitMQ学习之spring配置文件rabbit标签的使用
下面我们通过一个实例看一下rabbit的使用. 1.实现一个消息监听器ReceiveMessageListener.Java package org.springframework.amqp.core ...
- java中的标识符
程序员自己定义的名称,例如类名,方法名,变量等等 标识符命名的规则 1.只能由字母(a-z,A-Z),数字(0-9),下划线(_)和美元符号($)组成 2.不能以数字开头 3.不能与关键字重名 4.严 ...
- Brain Network (hard) CodeForces - 690C 简单倍增 + 一些有趣的推导
Code: #include<cstdio> #include<cstring> #include<algorithm> using namespace std; ...
- linux下查看mysql版本的四种方法
Linux查看MySQL版本的四种方法 1 在终端下执行 mysql -V 2 在help中查找 mysql --help |grep Distrib 3 在mysql 里查看 select vers ...