Time Limit: 30 Sec  Memory Limit: 128 MB

Description

  给定矩阵 M,请计算 M^n,并将其中每一个元素对 1000000007 取模输出。

Input

  第 1 行包含两个整数 n,k,其中 n 使用二进制表示,可能含有前导零;
  余下 k 行描述了一个 k * k 的矩阵 M。

Output

  输出题目描述中要求的矩阵,格式同输入。

Sample Input

  010 3
  5 9 5
  5 4 0
  8 8 8

Sample Output

  110 121 65
  45 61 25
  144 168 104

HINT

  对于 100% 数据,满足 n <= 2^10000;k <= 50; 0 <= Mij < 10^9 +7

Solution

  矩阵乘法特征多项式优化,矩阵M的特征多项式是$f(\lambda)=|M-\lambda I|$,随便带入k+1个$\lambda$,高斯消元求出行列式的值,然后插值就能求出M的特征多项式(这里的总复杂度为$O(k^4)$,主要在计算行列式上面)。根据Cayley-Hamilton定理,$f(M)=0$,也就是说对同一个式子减去若干个$f(M)$后值不变,我们即可用M的k-1次多项式表示一个M的次幂,两个多项式相乘后对$f(M)$取模,然后就可以快速幂了,多项式取模和乘法用$O(k^2)$暴力就够了,总复杂度$O(k^4+k^2logn)$。

Code

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
inline int read()
{
int x;char c;
while((c=getchar())<''||c>'');
for(x=c-'';(c=getchar())>=''&&c<='';)x=x*+c-'';
return x;
}
#define ML 10000
#define MK 50
#define MN 100
#define MOD 1000000007
char s[ML+];
int k,c[MK+][MK+],x[MK+],ans[MK+][MK+];
inline int mo1(int x){return x<MOD?x:x-MOD;}
inline int mo2(int x){return x<?x+MOD:x;}
int inv(int x)
{
int r=,y=MOD-;
for(;y;y>>=,x=1LL*x*x%MOD)if(y&)r=1LL*r*x%MOD;
return r;
}
struct poly
{
int n,a[MN+];
poly(int n=,int a0=,int a1=):n(n){memset(a,,sizeof(a));a[]=a0;a[]=a1;}
friend poly operator+(poly a,const poly&b)
{
a.n=max(a.n,b.n);
for(int i=;i<=a.n;++i)a.a[i]=mo1(a.a[i]+b.a[i]);
return a;
}
friend poly operator*(const poly&a,const poly&b)
{
poly c(a.n+b.n);int i,j;ll x;
for(i=;i<=c.n;c.a[i++]=x%MOD)for(x=j=;j<=i&&j<=a.n;++j)
x+=1LL*a.a[j]*b.a[i-j],x>8e18?x%=MOD:;
return c;
}
friend poly operator*(poly a,int b)
{
for(int i=;i<=a.n;++i)a.a[i]=1LL*a.a[i]*b%MOD;
return a;
}
friend poly operator/(poly a,const poly&b)
{
poly c(a.n-b.n);int i,j;
for(i=a.n;i>=b.n;--i)
{
c.a[i-b.n]=1LL*a.a[i]*inv(b.a[b.n])%MOD;
for(j=;j<=b.n;++j)a.a[i-j]=mo2((a.a[i-j]-1LL*b.a[b.n-j]*c.a[i-b.n])%MOD);
}
return c;
}
friend poly operator%(poly a,const poly&b)
{
int i,j,x;
for(i=a.n;i>=b.n;--i)
{
x=1LL*a.a[i]*inv(b.a[b.n])%MOD;
for(j=;j<=b.n;++j)a.a[i-j]=mo2((a.a[i-j]-1LL*b.a[b.n-j]*x)%MOD);
}
a.n=b.n-;
return a;
}
}f,a,p(,);
struct mat
{
int z[MK+][MK+];
mat(){memset(z,,sizeof(z));}
friend mat operator*(const mat&a,const mat&b)
{
mat c;int i,j,k;ll x;
for(i=;i<=MK;++i)for(j=;j<=MK;c.z[i][j++]=x%MOD)
for(x=k=;k<=MK;++k)x+=1LL*a.z[i][k]*b.z[k][j],x>8e18?x%=MOD:;
return c;
}
}m,n;
int cal(int x)
{
int i,j,l,ans=;
for(i=;i<=k;++i)for(j=;j<=k;++j)c[i][j]=m.z[i][j];
for(i=;i<=k;++i)c[i][i]=mo2(c[i][i]-x);
for(i=;i<=k;++i)
{
for(j=i;j<=k;++j)if(c[j][i])break;
if(j>k)return ;
if(j>i)for(ans=MOD-ans,l=i;l<=k;++l)swap(c[i][l],c[j][l]);
ans=1LL*ans*c[i][i]%MOD;
for(j=i;++j<=k;)
{
x=1LL*c[j][i]*inv(c[i][i])%MOD;
for(l=i;l<=k;++l)c[j][l]=mo2((c[j][l]-1LL*c[i][l]*x)%MOD);
}
}
return ans;
}
int main()
{
int i,j,l,v;
scanf("%s",s+);k=read();
for(i=;i<=k;++i)for(j=;j<=k;++j)m.z[i][j]=read();
for(i=;i<=k;++i)x[i]=cal(i);
for(i=;i<=k;++i)p=p*poly(,mo2(-i),);
for(i=;i<=k;++i)
{
for(v=x[i],j=;j<=k;++j)if(i!=j)v=1LL*v*inv(mo2(i-j))%MOD;
f=f+p/poly(,mo2(-i),)*v;
}
a=poly(,);p=poly(,,);
for(i=strlen(s+);i;--i,p=p*p%f)if(s[i]>'')a=a*p%f;
for(i=;i<=k;++i)n.z[i][i]=;
for(l=;l<k;++l,n=n*m)for(i=;i<=k;++i)for(j=;j<=k;++j)
ans[i][j]=(ans[i][j]+1LL*a.a[l]*n.z[i][j])%MOD;
for(i=;i<=k;printf("%d\n",ans[i++][j]))for(j=;j<k;++j)printf("%d ",ans[i][j]);
}

[BZOJ]4162: shlw loves matrix II的更多相关文章

  1. [bzoj4162]shlw loves matrix II

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

  2. BZOJ4162:shlw loves matrix II

    传送门 利用Cayley-Hamilton定理,用插值法求出特征多项式 \(P(x)\) 然后 \(M^n\equiv M^n(mod~P(x))(mod~P(x))\) 然后就多项式快速幂+取模 最 ...

  3. bzoj 3462: DZY Loves Math II

    3462: DZY Loves Math II Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 211  Solved: 103[Submit][Sta ...

  4. bzoj 4161 Shlw loves matrixI——常系数线性齐次递推

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4161 还是不能理解矩阵…… 关于不用矩阵理解的方法:https://blog.csdn.ne ...

  5. BZOJ 3569 DZY Loves Chinese II

    Description 神校XJ之学霸兮,Dzy皇考曰JC. 摄提贞于孟陬兮,惟庚寅Dzy以降. 纷Dzy既有此内美兮,又重之以修能. 遂降临于OI界,欲以神力而凌♂辱众生. 今Dzy有一魞歄图,其上 ...

  6. BZOJ 3569: DZY Loves Chinese II [高斯消元XOR 神题]

    http://www.lydsy.com/JudgeOnline/problem.php?id=3569 题意:多次询问一个无向连通图当图中某k条边消失时这个图是否联通 强制在线 太神啦啦啦啦啦啦啦啦 ...

  7. [bzoj4161]Shlw loves matrix I

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

  8. bzoj 4161: Shlw loves matrixI

    Description 给定数列 {hn}前k项,其后每一项满足 hn = a1h(n-1) + a2h(n-2) + ... + ak*h(n-k) 其中 a1,a2...ak 为给定数列.请计算 ...

  9. BZOJ 3569 DZY Loves Chinese II 树上差分+线性基

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3569 Description 神校XJ之学霸兮,Dzy皇考曰JC. 摄提贞于孟陬兮,惟庚寅 ...

随机推荐

  1. Beta冲刺 第七天

    Beta冲刺 第七天 昨天的困难 昨天的困难在一些多表查询上,不熟悉hibernate的套路,走了很多弯路. 第一次使用图表插件,在图表的显示问题上花了一定的时间. 对于页面绑定和后台数据自动填充的理 ...

  2. python简单路由系统

    # 输入模块名/函数 url = input('请输入网址:') module,func = url.split('/') m = __import__('lib.'+module,fromlist= ...

  3. $(function(){})和window.onload的区别

    (1)$(function(){}):DOM节点创建 完成才执行 (2)window.onload:页面所有资源(JS/CSS)加载完成才执行

  4. JAVA_SE基础——12.运算符的优先级

    优先级 操作符 含义 关联性 用法 ---------------------------------------------------------------- 1 [ ] 数组下标 左 arra ...

  5. Mego(04) - Mego入门

    本教程演示创建一个简单的数据库访问及更新数据的示例以便于初步了解下Mego框架的使用. 文中使用Visual Studio 2017版本. 创建Visual Studio项目 创建一个名为 MegoS ...

  6. Ansible自动化运维工具-上

    [Ansible特点] 1)Ansible与saltstack均是基于Python语言开发的 2)安装使用简单,基于不同插件和模块实现各种软件,平台,版本的管理以及支持虚拟容器多层级的部署 3)不需要 ...

  7. Python内置函数(18)——bin

    英文文档: bin(x) Convert an integer number to a binary string. The result is a valid Python expression. ...

  8. istio入门(04)istio的helloworld-部署构建

    参考链接: https://zhuanlan.zhihu.com/p/27512075 安装Istio目前仅支持Kubernetes,在部署Istio之前需要先部署好Kubernetes集群并配置好k ...

  9. 九、Python+Selenium模拟用QQ登陆腾讯课堂,并提取报名课程(练习)

    研究QQ登录规则的话,得分析大量Javascript的加密解密,比较耗时间.自己也是练习很少,短时间成功不了.所以走了个捷径. Selenium是一个WEB自动化测试工具,它运行时会直接实例化出一个浏 ...

  10. JavaScript的sleep实现--Javascript异步编程学习

    一.原始需求 最近在做百度前端技术学院的练习题,有一个练习是要求遍历一个二叉树,并且做遍历可视化即正在遍历的节点最好颜色不同 二叉树大概长这个样子: 以前序遍历为例啊, 每次访问二叉树的节点加个sle ...