博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ4162:shlw loves matrix II
阅读量:5827 次
发布时间:2019-06-18

本文共 3184 字,大约阅读时间需要 10 分钟。

利用Cayley-Hamilton定理,用插值法求出特征多项式 \(P(x)\)
然后 \(M^n\equiv M^n(mod~P(x))(mod~P(x))\)
然后就多项式快速幂+取模
最后得到了一个关于 \(M\) 的多项式,代入 \(M^i\) 即可

# include 
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;}

转载于:https://www.cnblogs.com/cjoieryl/p/10198777.html

你可能感兴趣的文章
spring两大核心对象IOC和AOP(新手理解)
查看>>
数据分析相关
查看>>
Python LDAP中的时间戳转换为Linux下时间
查看>>
微信小程序蓝牙连接小票打印机
查看>>
环境错误2
查看>>
C++_了解虚函数的概念
查看>>
全新jmeter视频已经上架
查看>>
Windows 8下如何删除无线配置文件
查看>>
oracle系列(五)高级DBA必知的Oracle的备份与恢复(全录收集)
查看>>
hp 服务器通过串口重定向功能的使用
查看>>
国外10大IT网站和博客网站
查看>>
android第十一期 - SmoothSwitchLibrary仿IOS切换Activity动画效果
查看>>
zabbix 批量web url监控
查看>>
MongoDB CookBook读书笔记之导入导出
查看>>
shell如何快速锁定所有账号
查看>>
HTML 5实现的手机摇一摇
查看>>
Linux 文件IO理解
查看>>
Ninject 2.x细说---2.绑定和作用域
查看>>
30个非常时尚的网页联系表单设计优秀示例
查看>>
使用membership(System.Web.Security)来进行角色与权限管理
查看>>