UVA 1386 - Cellular Automaton(循环矩阵)
UVA 1386 - Cellular Automaton
题意:给定一个n格的环,如今有个距离d。每次变化把环和他周围距离d以内的格子相加,结果mod m,问经过k次变换之后,环上的各个数字
思路:矩阵非常好想,每一个位置相应周围几个位置为1。其余位置为0,可是这个矩阵有500。有点大,直接n^3去求矩阵不太合适。然后观察发现这个矩阵是个循环矩阵,循环矩阵相乘的话,仅仅须要保存一行就可以。然后用n^2的时间就足够计算了
代码:
#include <stdio.h>
#include <string.h> const int N = 505; long long n, m, d, k, a[N]; struct mat {
long long v[N];
mat() {memset(v, 0, sizeof(v));}
mat operator * (mat c) {
mat ans;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
ans.v[i] = ((ans.v[i] + v[j] * c.v[(j - i + n) % n]) % m + m) % m;
}
}
return ans;
}
}; mat pow_mod(mat x, long long k) {
if (k == 1) return x;
mat sb = x * x;
mat ans = pow_mod(sb, k>>1);
if (k&1) ans = ans * x;
return ans;
} int main() {
while (~scanf("%lld%lld%lld%lld", &n, &m, &d, &k)) {
mat start;
for (int i = 0; i <= d; i++)
start.v[i] = 1;
for (int i = n - 1; i > n - 1 - d; i--)
start.v[i] = 1;
start = pow_mod(start, k);
for (int i = 0; i < n; i++)
scanf("%lld", &a[i]);
for (int i = 0; i < n; i++) {
long long ans = 0;
for (int j = 0; j < n; j++)
ans = ((ans + a[j] * start.v[(j - i + n) % n]) % m + m) % m;
printf("%lld%c", ans, (i == n - 1 ? '\n' : ' '));
}
}
return 0;
}
版权声明:本文博客原创文章,博客,未经同意,不得转载。
UVA 1386 - Cellular Automaton(循环矩阵)的更多相关文章
- UVA 1386 Cellular Automaton
矩阵快速幂. 样例是这样构造矩阵的: 矩阵很好构造,但是500*500*500*logk的复杂度显然是无法通过这题的. 其实本题构造出来的矩阵是一个循环矩阵,只需直到第一行或者第一列,即可直到整个矩阵 ...
- 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 ...
- UVa 3704 Cellular Automaton(矩乘)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=15129 [思路] 矩阵乘法-循环矩阵 题目中的转移矩阵是一个循环矩 ...
- 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是个循环矩阵,也就是将某一行所有元素统一 ...
- POJ3150—Cellular Automaton(循环矩阵)
题目链接:http://poj.org/problem?id=3150 题目意思:有n个数围成一个环,现在有一种变换,将所有距离第i(1<=i<=n)个数小于等于d的数加起来,对m取余,现 ...
- [POJ 3150] Cellular Automaton (矩阵高速幂 + 矩阵乘法优化)
Cellular Automaton Time Limit: 12000MS Memory Limit: 65536K Total Submissions: 3048 Accepted: 12 ...
随机推荐
- oracle 11g 11.2.0.1 设置HuagePage导致TRC 变大 变多
最近发现diag/..../trac/ 目录下 sid_ora_xxxx.trc 文件大小为11M 而且类似文件数量很大.导致占用了8G硬盘空间 另外个同事说他的DG没有这个问题. 都一样的系统和一 ...
- ls命令显示可执行的文件 ls -F
ls命令显示可执行的文件 ls -F
- Add custom and listview web part to a page in wiki page using powershell
As we know, Adding list view web part is different from custom web part using powershell, what's mor ...
- android 高效显示Bitmap - 开发文档翻译
由于本人英文能力实在有限,不足之初敬请谅解 本博客只要没有注明“转”,那么均为原创,转贴请注明本博客链接链接 Displaying Bitmaps Efficiently 高效显示Bitmap Lea ...
- 算法练习之DP 求LCM (最长公共子序列)
1. 对于序列x[1,i]和y[1,j],推导递推公式1.a 假设当前元素同样,那么就将当前最大同样数+12.b 假设当前元素不同.那么就把当前最大同样数"传递"下去 因此递推公式 ...
- UML03-类图
1.在类图中,聚合关系表达总体与局部的关系. 2.请根据下面的需求,画出用例图和类图. 系统允许管理员通过磁盘加载存货数据来运行存货清单报告: 管理员通过从磁盘加载存货数据.向磁盘保存存货数据来更新存 ...
- hdu 3998 (dp+最大流)
题意:求最长上升子序列的长度和数量. 分析:用dp求出最长上升子序列m,dp数组存的就是该元素为子序列结尾的长度,源点与长度为1的点建边,长度为m的与汇点连边,然后枚举任意两个元素,ai,aj(ai& ...
- OpenProcessToken令牌函数使用方法
>GetCurrentProcessID 得到当前进程的ID OpenProcessToken得到进程的令牌句柄LookupPrivilegeValue 查询进程的权限AdjustTokenPr ...
- ASP.NET - Web.config文件详解
周金桥:asp.net夜话之十一:web.config详解 链接:http://zhoufoxcn.blog.51cto.com/792419/166441/
- 基于MFC简单图片裁剪工具
话说这几天又没干啥正事,看书没效率,游戏也没怎么玩,尼玛时间都去哪儿了! --------------------------------------------------------------- ...