BZOJ4162:shlw loves matrix II
传送门
利用Cayley-Hamilton定理,用插值法求出特征多项式 \(P(x)\)
然后 \(M^n\equiv M^n(mod~P(x))(mod~P(x))\)
然后就多项式快速幂+取模
最后得到了一个关于 \(M\) 的多项式,代入 \(M^i\) 即可
# include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod(1e9 + 7);
inline int Pow(ll x, int y) {
register ll ret = 1;
for (; y; y >>= 1, x = x * x % mod)
if (y & 1) ret = ret * x % mod;
return ret;
}
inline void Inc(int &x, int y) {
x = x + y >= mod ? x + y - mod : x + y;
}
inline int Dec(int x, int y) {
return x - y < 0 ? x - y + mod : x - y;
}
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];
char str[10005];
inline int Gauss() {
register int i, j, k, inv, ans = 1;
for (i = 1; i <= n; ++i) {
for (j = i; j <= n; ++j)
if (b[j][i]) {
if (i != j) swap(b[i], b[j]), ans = mod - ans;
break;
}
for (j = i + 1; j <= n; ++j)
if (b[j][i]) {
inv = (ll)b[j][i] * Pow(b[i][i], mod - 2) % mod;
for (k = i; k <= n; ++k) Inc(b[j][k], mod - (ll)b[i][k] * inv % mod);
}
ans = (ll)ans * b[i][i] % mod;
}
return ans;
}
inline void Mul(int *x, int *y, int *z) {
register int i, j, inv;
memset(tmp, 0, sizeof(tmp));
for (i = 0; i <= n; ++i)
for (j = 0; j <= n; ++j) Inc(tmp[i + j], (ll)x[i] * y[j] % mod);
for (i = m; i >= n; --i) {
inv = (ll)tmp[i] * Pow(p[n], mod - 2);
for (j = 0; j <= n; ++j) Inc(tmp[i - j], mod - (ll)p[n - j] * inv % mod);
}
for (i = 0; i <= n; ++i) z[i] = tmp[i];
}
int main() {
register int i, j, k, l, inv;
scanf(" %s%d", str + 1, &n), len = strlen(str + 1), m = n << 1;
for (i = 1; i <= n; ++i)
for (j = 1; j <= n; ++j) scanf("%d", &a[i][j]);
for (i = 0; i <= n; ++i) {
memset(b, 0, sizeof(b));
for (j = 1; j <= n; ++j)
for (k = 1; k <= n; ++k)
b[j][k] = (j ^ k) ? mod - a[j][k] : Dec(i, a[j][k]);
yi[i] = Gauss();
}
for (i = 0; i <= n; ++i) {
memset(tmp, 0, sizeof(tmp)), tmp[0] = yi[i];
for (j = 0; j <= n; ++j)
if (j ^ i) {
for (k = n; k; --k) tmp[k] = Dec(tmp[k - 1], (ll)tmp[k] * j % mod);
tmp[0] = mod - (ll)tmp[0] * j % mod, inv = Pow(Dec(i, j), mod - 2);
for (k = 0; k <= n; ++k) tmp[k] = (ll)tmp[k] * inv % mod;
}
for (j = 0; j <= n; ++j) Inc(p[j], tmp[j]);
}
c[0] = d[1] = 1;
for (i = len; i; --i) {
if (str[i] == '1') Mul(c, d, c);
Mul(d, d, d);
}
memset(b, 0, sizeof(b));
for (i = 1; i <= n; ++i) mt[i][i] = 1;
for (l = 0; l <= n; ++l) {
for (i = 1; i <= n; ++i)
for (j = 1; j <= n; ++j)
Inc(b[i][j], (ll)c[l] * mt[i][j] % mod);
memset(tmt, 0, sizeof(tmt));
for (i = 1; i <= n; ++i)
for (j = 1; j <= n; ++j)
for (k = 1; k <= n; ++k)
Inc(tmt[i][k], (ll)mt[i][j] * a[j][k] % mod);
memcpy(mt, tmt, sizeof(mt));
}
for (i = 1; i <= n; ++i, putchar('\n'))
for (j = 1; j <= n; ++j) printf("%d ", b[i][j]);
return 0;
}
BZOJ4162:shlw loves matrix II的更多相关文章
- [bzoj4162]shlw loves matrix II
来自FallDream的博客,未经允许,请勿转载,谢谢 给定矩阵k*k的矩阵M,请计算 M^n,并将其中每一个元素对 1000000007 取模输出. k<=50 n<=2^10000 考 ...
- [BZOJ]4162: shlw loves matrix II
Time Limit: 30 Sec Memory Limit: 128 MB Description 给定矩阵 M,请计算 M^n,并将其中每一个元素对 1000000007 取模输出. Inpu ...
- [bzoj4161]Shlw loves matrix I
来自FallDream的博客,未经允许,请勿转载,谢谢. 给定数列 {hn}前k项,其后每一项满足 hn = a1*h(n-1) + a2*h(n-2) + ... + ak*h(n-k) 其中 a1 ...
- 【leetcode】Spiral Matrix II
Spiral Matrix II Given an integer n, generate a square matrix filled with elements from 1 to n2 in s ...
- 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 ...
- 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 ...
- 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? ...
- 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 ...
- leetcode 54. Spiral Matrix 、59. Spiral Matrix II
54题是把二维数组安卓螺旋的顺序进行打印,59题是把1到n平方的数字按照螺旋的顺序进行放置 54. Spiral Matrix start表示的是每次一圈的开始,每次开始其实就是从(0,0).(1,1 ...
随机推荐
- 回归到jquery
最近在做一个公司的老产品的新功能,使用原来的技术框架,jquery和一堆插件,使用jquery的话,灵活性是有了,但是对于一个工作了3年多的我来说,很low,没什么成就感,技术本身比较简单,但是业务的 ...
- Matplotlib的初次使用
# -*- coding: utf-8 -*-#先画一个线性图 import numpy as np import matplotlib.pyplot as plt x=[0,1] y=[0,1] p ...
- C# .net 使用正则表达式去掉字符串中的数字
/// <summary>/// 去掉字符串中的数字/// </summary>/// <param name="key"></param ...
- normalize.css源码解析
什么是normalize.css? 它是为了帮助我们统一各个浏览器的样式和消除bug的css库. 为什么需要normalize.css,有什么好处? 不像一些reset.css,normalize. ...
- 使用webpack && react环境
使用webpack webpack是一款模块化的打包工具,它认为所有的文件都是模块,包括js,css等等,版本为2.x推荐学习,1.x版本已废弃,不建议使用. 目前,facebook官方就是使用web ...
- Win10 VS2015 静态编译Qt5.6.2源码
由于VS2015需要CRT等拓展组件,因此把内部编写的工具软件以静态发布,固需要编译Qt源码.Qt5.6.2版本,VS2015,Win10 1.安装python,perl,下载jom 2.改文件com ...
- ubuntu 添加多个IP
上次这个问题 : UBUNTU 无法解析域名 解决方法 解决后,每次重启电脑都需要重新配置 /etc/resolv.conf. 这次添加IP的时候留心发现,在/etc/network/interfa ...
- Hive 外部表新增字段或者修改字段类型等不生效
标题比较笼统,实际情况是: 对于Hive 的分区外部表的已有分区,在对表新增或者修改字段后,相关分区不生效. 原因是:表元数据虽然修改成功,但是分区也会对应列的元数据,这个地方不会随表的元数据修改而修 ...
- 微服务Kong(七)——CLI参考
KONG提供了一套CLI(命令行界面)命令,您可以通过它来启动.停止和管理您的Kong实例.CLI管理您的本地节点(如在当前机器上). 全局配置 所有命令都采用一组指定的可选标志作为参数: --hel ...
- 解决SSH连接linux时长时间不操作自动断开
最近重装Linux系统,但是这次ssh连接云服务区Linux系统时,经常出现一段时间不操作,连接自动中断,表现为光标还在闪动,但是却无法操作.只好关闭终端,重新连接,很是麻烦. 为此,通过网络查找,找 ...