传送门

利用Cayley-Hamilton定理,用插值法求出特征多项式 \(P(x)\)

然后 \(M^n\equiv M^n(mod~P(x))(mod~P(x))\)

然后就多项式快速幂+取模

最后得到了一个关于 \(M\) 的多项式,代入 \(M^i\) 即可

  1. # include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. const int mod(1e9 + 7);
  5. inline int Pow(ll x, int y) {
  6. register ll ret = 1;
  7. for (; y; y >>= 1, x = x * x % mod)
  8. if (y & 1) ret = ret * x % mod;
  9. return ret;
  10. }
  11. inline void Inc(int &x, int y) {
  12. x = x + y >= mod ? x + y - mod : x + y;
  13. }
  14. inline int Dec(int x, int y) {
  15. return x - y < 0 ? x - y + mod : x - y;
  16. }
  17. int n, m, a[55][55], b[55][55], mt[55][55], tmt[55][55], len, c[55], d[55], p[55], tmp[105], yi[55];
  18. char str[10005];
  19. inline int Gauss() {
  20. register int i, j, k, inv, ans = 1;
  21. for (i = 1; i <= n; ++i) {
  22. for (j = i; j <= n; ++j)
  23. if (b[j][i]) {
  24. if (i != j) swap(b[i], b[j]), ans = mod - ans;
  25. break;
  26. }
  27. for (j = i + 1; j <= n; ++j)
  28. if (b[j][i]) {
  29. inv = (ll)b[j][i] * Pow(b[i][i], mod - 2) % mod;
  30. for (k = i; k <= n; ++k) Inc(b[j][k], mod - (ll)b[i][k] * inv % mod);
  31. }
  32. ans = (ll)ans * b[i][i] % mod;
  33. }
  34. return ans;
  35. }
  36. inline void Mul(int *x, int *y, int *z) {
  37. register int i, j, inv;
  38. memset(tmp, 0, sizeof(tmp));
  39. for (i = 0; i <= n; ++i)
  40. for (j = 0; j <= n; ++j) Inc(tmp[i + j], (ll)x[i] * y[j] % mod);
  41. for (i = m; i >= n; --i) {
  42. inv = (ll)tmp[i] * Pow(p[n], mod - 2);
  43. for (j = 0; j <= n; ++j) Inc(tmp[i - j], mod - (ll)p[n - j] * inv % mod);
  44. }
  45. for (i = 0; i <= n; ++i) z[i] = tmp[i];
  46. }
  47. int main() {
  48. register int i, j, k, l, inv;
  49. scanf(" %s%d", str + 1, &n), len = strlen(str + 1), m = n << 1;
  50. for (i = 1; i <= n; ++i)
  51. for (j = 1; j <= n; ++j) scanf("%d", &a[i][j]);
  52. for (i = 0; i <= n; ++i) {
  53. memset(b, 0, sizeof(b));
  54. for (j = 1; j <= n; ++j)
  55. for (k = 1; k <= n; ++k)
  56. b[j][k] = (j ^ k) ? mod - a[j][k] : Dec(i, a[j][k]);
  57. yi[i] = Gauss();
  58. }
  59. for (i = 0; i <= n; ++i) {
  60. memset(tmp, 0, sizeof(tmp)), tmp[0] = yi[i];
  61. for (j = 0; j <= n; ++j)
  62. if (j ^ i) {
  63. for (k = n; k; --k) tmp[k] = Dec(tmp[k - 1], (ll)tmp[k] * j % mod);
  64. tmp[0] = mod - (ll)tmp[0] * j % mod, inv = Pow(Dec(i, j), mod - 2);
  65. for (k = 0; k <= n; ++k) tmp[k] = (ll)tmp[k] * inv % mod;
  66. }
  67. for (j = 0; j <= n; ++j) Inc(p[j], tmp[j]);
  68. }
  69. c[0] = d[1] = 1;
  70. for (i = len; i; --i) {
  71. if (str[i] == '1') Mul(c, d, c);
  72. Mul(d, d, d);
  73. }
  74. memset(b, 0, sizeof(b));
  75. for (i = 1; i <= n; ++i) mt[i][i] = 1;
  76. for (l = 0; l <= n; ++l) {
  77. for (i = 1; i <= n; ++i)
  78. for (j = 1; j <= n; ++j)
  79. Inc(b[i][j], (ll)c[l] * mt[i][j] % mod);
  80. memset(tmt, 0, sizeof(tmt));
  81. for (i = 1; i <= n; ++i)
  82. for (j = 1; j <= n; ++j)
  83. for (k = 1; k <= n; ++k)
  84. Inc(tmt[i][k], (ll)mt[i][j] * a[j][k] % mod);
  85. memcpy(mt, tmt, sizeof(mt));
  86. }
  87. for (i = 1; i <= n; ++i, putchar('\n'))
  88. for (j = 1; j <= n; ++j) printf("%d ", b[i][j]);
  89. return 0;
  90. }

BZOJ4162:shlw loves matrix II的更多相关文章

  1. [bzoj4162]shlw loves matrix II

    来自FallDream的博客,未经允许,请勿转载,谢谢 给定矩阵k*k的矩阵M,请计算 M^n,并将其中每一个元素对 1000000007 取模输出. k<=50 n<=2^10000 考 ...

  2. [BZOJ]4162: shlw loves matrix II

    Time Limit: 30 Sec  Memory Limit: 128 MB Description 给定矩阵 M,请计算 M^n,并将其中每一个元素对 1000000007 取模输出. Inpu ...

  3. [bzoj4161]Shlw loves matrix I

    来自FallDream的博客,未经允许,请勿转载,谢谢. 给定数列 {hn}前k项,其后每一项满足 hn = a1*h(n-1) + a2*h(n-2) + ... + ak*h(n-k) 其中 a1 ...

  4. 【leetcode】Spiral Matrix II

    Spiral Matrix II Given an integer n, generate a square matrix filled with elements from 1 to n2 in s ...

  5. 59. Spiral Matrix && Spiral Matrix II

    Spiral Matrix Given a matrix of m x n elements (m rows, n columns), return all elements of the matri ...

  6. Search a 2D Matrix | & II

    Search a 2D Matrix II Write an efficient algorithm that searches for a value in an m x n matrix, ret ...

  7. hdu 5265 pog loves szh II STL

    pog loves szh II Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php? ...

  8. LintCode 38. Search a 2D Matrix II

    Write an efficient algorithm that searches for a value in an m x n matrix, return the occurrence of ...

  9. leetcode 54. Spiral Matrix 、59. Spiral Matrix II

    54题是把二维数组安卓螺旋的顺序进行打印,59题是把1到n平方的数字按照螺旋的顺序进行放置 54. Spiral Matrix start表示的是每次一圈的开始,每次开始其实就是从(0,0).(1,1 ...

随机推荐

  1. Java 自定义注解与注解解析实例

    在学习Java之后会遇到很多的注解,有加载JavaBean的注解:@Component,@Service,@Controller:有获取配置文件中数值的注解@Value:有获取Http请求的数据的注解 ...

  2. 【性能测试】jmeter的坑(1)——如何在多网卡情况下正确连接

    问题现象: 性能测试时,使用的服务器配置了双网卡,windows客户机配置了四网卡,坑爹的配置,内外网的隔离,导致在使用jmeter进行分布式测试的时候总是连接失败. 原因分析: Jmeter采用了r ...

  3. 41.oracle索引,分析索引,索引碎片整理

    概述 索引分为B树索引和位图索引.我们主要研究B树索引,B树索引如下图(图片源自网络):

  4. C#-WebForm-AJAX阿贾克斯(一)基础知识

    AJAX 即“ Asynchronous Javascript And XML ”(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术. AJAX = 异步 JavaScri ...

  5. 蓝桥杯-学霸的迷宫(BFS+记录操作)

     算法提高 学霸的迷宫   时间限制:1.0s   内存限制:256.0MB      问题描述 学霸抢走了大家的作业,班长为了帮同学们找回作业,决定去找学霸决斗.但学霸为了不要别人打扰,住在一个城堡 ...

  6. CentOS 7下安装RabbitMQ

    下载erlang:http://www.erlang.org/downloads ,otp_src_20.3.tar.gz 下载RabbitMQ: http://www.rabbitmq.com ,r ...

  7. Mac 10.12安装飞鸽传书IPMessager

    说明:这个版本的飞鸽传书不能和Linux的互通,但是可以和Windows的互通,我猜测是协议问题:如果想要互通只能是Mac和Linux同时安装iptux. 下载: (链接: https://pan.b ...

  8. Mac 10.12高级防火墙pfctl教程收集(待实践)

    在Mac 10.10之前使用ipfw.之后升级为pfctl.由于Mac自带的GUI防火墙只能针对软件进行放开,且无法针对特定端口入站及出站进行管理.所以使用pfctl能解决这类问题. 收集教程如下: ...

  9. (转)DB2和 Oracle的并发控制(锁)比较

    DB2和 Oracle的并发控制(锁)比较 牛 新庄2005 年 12 月 26 日发布 原文:https://www.ibm.com/developerworks/cn/data/library/t ...

  10. java线程状态 以及 sheep()、wait()、yield() 区别

    前言 最近看到很多人都在讨论多线程的问题,于是写出了这篇博客,希望可以帮到正在学习和使用这块的朋友们,首先我们先看看两个图(两个图都来自其他码农的分享)   这两个图是一样的逻辑,这里一起罗列出来,下 ...