LA 3704 (矩阵快速幂 循环矩阵) Cellular Automaton
2024-08-26 21:49:45
将这n个格子看做一个向量,每次操作都是一次线性组合,即vn+1 = Avn,所求答案为Akv0
A是一个n*n的矩阵,比如当n=5,d=1的时候:
不难发现,A是个循环矩阵,也就是将某一行所有元素统一向右移动一位便得到下一行。
而且循环矩阵相乘仍然是循环矩阵,所以只要求出Ak的第一行就行了。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std; const int maxn = + ;
typedef long long Vector[maxn]; int n, m, d, k; inline int value(Vector A, int i, int j)
{//循环矩阵A(i, j)的值
return A[(((j-i)%n)+n)%n];
} void matrix_mul(Vector A, Vector B, Vector res)
{
Vector C;
memset(C, , sizeof(C));
for(int j = ; j < n; j++)
for(int k = ; k < n; k++)
C[j] = (C[j] + A[k] * value(B, k, j)) % m;
memcpy(res, C, sizeof(C));
} void matrix_pow(Vector A, int n, Vector res)
{
Vector a, r;
memcpy(a, A, sizeof(a));
memset(r, , sizeof(r));
r[] = ;
while(n)
{
if(n&) matrix_mul(r, a, r);
n >>= ;
matrix_mul(a, a, a);
}
memcpy(res, r, sizeof(r));
} void solve(Vector A, Vector v, Vector res)
{
Vector B;
memset(B, , sizeof(B));
for(int i = ; i < n; i++)
for(int j = ; j < n; j++)
B[i] = (B[i] + value(A, i, j) * v[j]) % m;
memcpy(res, B, sizeof(B));
} int main()
{
//freopen("in.txt", "r", stdin); while(cin >> n >> m >> d >> k)
{
Vector A, v;
for(int i = ; i < n; i++) cin >> v[i];
memset(A, , sizeof(A));
for(int p = -d; p <= d; p++)
{
int x = ((p%n)+n)%n;
A[x] = ;
}
/*for(int i = 0; i < n; i++)
{
for(int j = 0; j < n; j++)
printf("%d ", value(A, i, j));
printf("\n");
}*/
matrix_pow(A, k, A);
solve(A, v, v);
for(int i = ; i < n; i++)
{
if(i) printf(" ");
cout << v[i];
}
printf("\n");
} return ;
}
代码君
最新文章
- WPF中如何将ListViewItem双击事件绑定到Command
- Android初涉及之Android Studio&;JAVA入门--二月不能不写东西
- UVA 10714 Ants 蚂蚁 贪心+模拟 水题
- C# 热水器
- Swift - 动态添加删除TableView的单元格(以及内部元件)
- D3D Learning_01_CreateWindow
- Dubbox中开发REST风格的远程调用
- Linux 文件系统模型
- java 之 迭代器模式(大话设计模式)
- Swift基础之Animation动画研究
- Centos7破解密码的两种方法--技术流ken
- SpringBoot之profile详解
- offset[Parent/Width/Height/Top/Left] 、 client[Width/Height/Top/Left] 、 Element.getBoundingClientRect()
- # bzoj2215: [Poi2011]Conspiracy 2-sat
- html回顾随笔1(*^__^*)
- Nginx 服务器搭建
- Java-Runoob-高级教程-实例-数组:05. Java 实例 – 数组输出
- Rust语言学习笔记(4)
- hdu-2191(完全背包+二进制优化模板)
- jetBrains 插件开发第一课-- 在主菜单栏新增一个菜单
热门文章
- 文字沟通工具使用SignalR,跨域例子源代码
- angular-file-upload API angular文件上传插件
- c++ 如何实现,readonly
- html利用锚点实现定位代码实例
- Error: Exception in thread “main” java.lang.NoClassDefFoundError错误
- struts2+hibernate+spring+jquery返回json List列表
- C++中的const关键字
- hdu 1713 相遇周期
- Bash的脚本参数
- cygwin如何断点续传