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 的距离 ...
随机推荐
- canvas的常用api
canvas 标签 <canvas width="600" height="400" id="canvas"></canv ...
- JS网站图集相册特效
JS网站图集相册特效是一款可以直接使用鼠标进行前后导航,也可以通过缩略图来切换图片. 在线演示本地下载
- (转) 50个CSS技巧
这里我工作中收集了10个很不错的CSS技巧,你可以用在你的项目上.它可以帮你很好地整理你的元素并让他们看起来蛮酷的.下面开始我们的内容,希望你会喜欢它.下面是我收集的CSS技巧,希望能帮助到你,感觉收 ...
- jQueryDOM操作模块
DOM操作模块 1.复习选择器模块(选择器模块结束) 目的:学而时习之 复习和总结选择器模块 2.DOM的基本操作方法 目标:回顾DOM操作的基本方法 3.1 DOM操作 -创建节点 练习 1:创建1 ...
- Android学习——Button填充颜色及实现圆角
在drawable下新建文件夹bt_shape.xml,如下: <?xml version="1.0" encoding="utf-8"?> < ...
- MFC知识点总结
一:消息1.什么是消息?消息是驱动windows系统运行的基础.从计算机的角度来看,消息就是一个整数. (1)一个无符号整数,是消息值: (2)消息附带的WPARAM和LPARAM类型的参 ...
- css3 flex 详解,可以实现div内容水平垂直居中
先说一下flex一系列属性: 一.flex-direction: (元素排列方向) ※ flex-direction:row (横向从左到右排列==左对齐) ※ flex-direction:row- ...
- golang new和make的区别
自:http://www.cnblogs.com/ghj1976/archive/2013/02/12/2910384.html make用于内建类型(map.slice 和channel)的内存分配 ...
- Installshield下如何在指定目录执行bat
在做InstallShield中碰到这样的问题,有service.bat需要在指定的一个目录运行. 一开始在bat内写入语句: cd d:\XXXXX command1.exe command2.ex ...
- setTimeout()传带有参数的函数
w3cshool里的解释:setTimeout() 方法用于在指定的毫秒数后调用函数或计算表达式,语法:setTimeout(code,millisec). 也就是说,第一个参数可以是字符串形式的Ja ...