将这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 ;
}

代码君

LA 3704 (矩阵快速幂 循环矩阵) Cellular Automaton的更多相关文章

  1. Luogu 3390 【模板】矩阵快速幂 (矩阵乘法,快速幂)

    Luogu 3390 [模板]矩阵快速幂 (矩阵乘法,快速幂) Description 给定n*n的矩阵A,求A^k Input 第一行,n,k 第2至n+1行,每行n个数,第i+1行第j个数表示矩阵 ...

  2. HDU 2276 Kiki & Little Kiki 2( 矩阵快速幂 + 循环同构矩阵 )

    蒟蒻的我还需深入学习 链接:传送门 题意:给出一个长度为 n,n 不超过100的 01 串 s ,每当一个数字左侧为 1 时( 0的左侧是 n-1 ),这个数字就会发生改变,整个串改变一次需要 1s ...

  3. 51nod 1113 矩阵快速幂( 矩阵快速幂经典模板 )

    1113 矩阵快速幂 链接:传送门 思路:经典矩阵快速幂,模板题,经典矩阵快速幂模板. /******************************************************* ...

  4. HDU 1588 矩阵快速幂 嵌套矩阵

    这个题目搞了我差不多一个下午,之前自己推出一个公式,即 f[n+k]=k*f[n]+f[n-1]结果发现根本不能用,无法降低复杂度. 后来又个博客的做法相当叼,就按他的做法来了 即 最终求得是 S(n ...

  5. 题解——洛谷P3390 【模板】矩阵快速幂(矩阵乘法)

    模板题 留个档 #include <cstdio> #include <algorithm> #include <cstring> #define int long ...

  6. hdu6470 矩阵快速幂+构造矩阵

    http://acm.hdu.edu.cn/showproblem.php?pid=6470 题意 \(f[n]=2f[n-2]+f[n-1]+n^3,n \leq 10^{18}\),求f[n] 题 ...

  7. bzoj 2326: [HNOI2011]数学作业【dp+矩阵快速幂】

    矩阵乘法一般不满足交换律!!所以快速幂里需要注意乘的顺序!! 其实不难,设f[i]为i的答案,那么f[i]=(f[i-1]w[i]+i)%mod,w[i]是1e(i的位数),这个很容易写成矩阵的形式, ...

  8. poj4474 Scout YYF I(概率dp+矩阵快速幂)

    Scout YYF I Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4100   Accepted: 1051 Descr ...

  9. hdu3483之二项式展开+矩阵快速幂

    A Very Simple Problem Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Ot ...

随机推荐

  1. ProgressDialog弹出时的底色变暗(转)

    背景:在做一个进度条时,不想让它的背景变暗,以免影响其他区域的正常显示. 在网上搜索时,看到的方法多数是: 方法一 :在代码中 可以这么设置 Window mWindow = getWindow(); ...

  2. How does java technology relate to cloud computing?

    Java Paas shootout   (@IBM developer) Cloud computing is always a hot topic around IT field today.Ho ...

  3. 【Leetcode】 - Single Number II

    Problem Discription: Suppose the array A has n items in which all of the numbers apear 3 times excep ...

  4. HDU 4587 TWO NODES 割点

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4587 题意: 删除两个点,使连通块的数目最大化 题解: 枚举删除第一个点,然后对删除了第一个点的图跑 ...

  5. SpringJUnit4加载类目录下(src)和WEF-INF目录下的配置文件二--获取注入的bean的二种方式

    前言: spring容器以xml的形式注入bean,然后可以在类中获取,获取的形式主要有二种:第一种最简单--采用@Resource 或@Autowired关键字在加载spring文件时将bean注入 ...

  6. Extjs关于FormPanel布局

    Extjs关于FormPanel布局 FormPanel有两种布局:form和column,form是纵向布局,column为横向布局.默认为后者.使用layout属性定义布局类型.对于一个复杂的布局 ...

  7. centos6.5安装vmware-tools

    一.问题描述 为什么使用vmware-tools:传文件方便,可以从主机中直接拖拽文件到centos中(但实际上我们可以用:WinSCP):鼠标切换方便,鼠标指到什么地方,表名当前正在操作哪个环境(但 ...

  8. 同一机器 部署 两个 jboss

    当jboss和oracle在同一机器上时,通常oracle占用8080端口,这时只需要去修改\deploy\jbossweb-tomcat50.sar\server.xml中.当在同一台机器上运行两个 ...

  9. 无法将 lambda 表达式 转换为类型“System.Delegate”,因为它不是委托类型

    this.BeginInvoke(() => { this.btnQuery.Enabled = false; //禁用查询 }); 跨线程调用时,编译上面的代码将提示 对于Control.In ...

  10. hdu 2582 f(n) 数学

    打表找规律: 当n为质数是,GCD(n)=n; 当n为质数k的q次方时,GCD(n)=k; 其他情况,GCD(n)=1. 代码如下: #include<iostream> #include ...