本文主要是介绍UVA - 1386 Cellular Automaton,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目:点击打开链接
题意:一个细胞自动机包含n个格子,每个格子的值都会变成它距离不超过d的所有格子的值,求最后的结果
思路:这个是循环矩阵,可以用O(n^2)的时间过掉
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn = 505;int n, m, d, k;
ll ans[maxn], matrix[maxn];
ll c[maxn+5];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) % n];for (int i = 0; i < n; i++) b[i] = c[i] % m;
}int main() {while (scanf("%d%d%d%d", &n, &m, &d, &k) != EOF) {memset(ans, 0, sizeof(ans));memset(matrix, 0, sizeof(matrix));for (int i = 0; i < n; i++) cin>>ans[i];matrix[0] = 1;for (int i = 1; i <= d; i++) matrix[i] = matrix[n - i] = 1;while (k) {if (k & 1) mul(matrix, ans);mul(matrix, matrix);k >>= 1;}for (int i = 0; i < n - 1; i++) printf("%lld ", ans[i]);printf("%lld\n", ans[n-1]);}return 0;
}
这篇关于UVA - 1386 Cellular Automaton的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!