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

代码君

最新文章

  1. WPF中如何将ListViewItem双击事件绑定到Command
  2. Android初涉及之Android Studio&amp;JAVA入门--二月不能不写东西
  3. UVA 10714 Ants 蚂蚁 贪心+模拟 水题
  4. C# 热水器
  5. Swift - 动态添加删除TableView的单元格(以及内部元件)
  6. D3D Learning_01_CreateWindow
  7. Dubbox中开发REST风格的远程调用
  8. Linux 文件系统模型
  9. java 之 迭代器模式(大话设计模式)
  10. Swift基础之Animation动画研究
  11. Centos7破解密码的两种方法--技术流ken
  12. SpringBoot之profile详解
  13. offset[Parent/Width/Height/Top/Left] 、 client[Width/Height/Top/Left] 、 Element.getBoundingClientRect()
  14. # bzoj2215: [Poi2011]Conspiracy 2-sat
  15. html回顾随笔1(*^__^*)
  16. Nginx 服务器搭建
  17. Java-Runoob-高级教程-实例-数组:05. Java 实例 – 数组输出
  18. Rust语言学习笔记(4)
  19. hdu-2191(完全背包+二进制优化模板)
  20. jetBrains 插件开发第一课-- 在主菜单栏新增一个菜单

热门文章

  1. 文字沟通工具使用SignalR,跨域例子源代码
  2. angular-file-upload API angular文件上传插件
  3. c++ 如何实现,readonly
  4. html利用锚点实现定位代码实例
  5. Error: Exception in thread “main” java.lang.NoClassDefFoundError错误
  6. struts2+hibernate+spring+jquery返回json List列表
  7. C++中的const关键字
  8. hdu 1713 相遇周期
  9. Bash的脚本参数
  10. cygwin如何断点续传