BZOJ 4162 shlw loves matrix II 拉格朗日插值+Cayley-Hamilton定理
来源:互联网 发布:toread知乎 编辑:程序博客网 时间:2024/06/10 06:32
题目大意:给定一个
首先先介绍一下特征值的相关内容……
对于矩阵
设
如何求特征多项式?
拉格朗日插值法,分别带入
特征多项式有啥用?
Cayley-Hamilton定理:
故有
总时间复杂度
#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#define M 55#define MOD 1000000007using namespace std;char s[10100];int n;int a[M][M],b[M][M],ans[M][M];int y[M];long long Quick_Power(long long x,int y){ long long re=1; while(y) { if(y&1) (re*=x)%=MOD; (x*=x)%=MOD; y>>=1; } return re;}int Det(int a[M][M]){ int k; long long re=1; for(int i=1;i<=n;i++) { for(k=i;k<=n;k++) if(a[k][i]) break; if(k==n+1) return 0; if(k!=i) { (re*=MOD-1)%=MOD; for(int j=1;j<=n;j++) swap(a[i][j],a[k][j]); } (re*=a[i][i])%=MOD; long long temp=Quick_Power(a[i][i],MOD-2); for(int j=1;j<=n;j++) a[i][j]=a[i][j]*temp%MOD; for(k=1;k<=n;k++) if(k!=i) { long long temp=(MOD-a[k][i])%MOD; for(int j=1;j<=n;j++) (a[k][j]+=a[i][j]*temp%MOD)%=MOD; } } return re;}struct Polynomial{ int a[M<<1]; Polynomial(int x) { memset(a,0,sizeof a); a[0]=x; } int& operator [] (int x) { return a[x]; } friend Polynomial operator + (Polynomial x,Polynomial y) { Polynomial z(0); for(int i=0;i<=n<<1;i++) z[i]=(x[i]+y[i])%MOD; return z; } friend Polynomial operator * (Polynomial x,Polynomial y) { Polynomial z(0); for(int i=0;i<=n;i++) for(int j=0;j<=n;j++) (z[i+j]+=(long long)x[i]*y[j]%MOD)%=MOD; return z; } Polynomial operator * (long long x)//f(x)*a; { Polynomial re(0); for(int i=0;i<=n<<1;i++) re[i]=(a[i]*x)%MOD; return re; } Polynomial Times(long long x,long long y) //f(x)*(ax+b) { Polynomial re(a[0]*y%MOD); for(int i=1;i<=n<<1;i++) re[i]=(a[i-1]*x+a[i]*y)%MOD; return re; } friend Polynomial operator % (Polynomial a,Polynomial b) // a%b { for(int i=n;~i;i--) { long long temp=(MOD-a[i+n]*Quick_Power(b[n],MOD-2)%MOD)%MOD; for(int j=0;j<=n;j++) (a[i+j]+=b[j]*temp%MOD)%=MOD; } return a; }};int main(){ scanf("%s",s); cin>>n; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) scanf("%d",&a[i][j]); for(int x=0;x<=n;x++) { memcpy(b,a,sizeof a); for(int i=1;i<=n;i++) (b[i][i]+=MOD-x)%=MOD; y[x]=Det(b); } Polynomial p(0); for(int x=0;x<=n;x++) { Polynomial temp(1); for(int i=0;i<=n;i++) if(i!=x) { temp=temp.Times(1,MOD-i); temp=temp*Quick_Power((x-i+MOD)%MOD,MOD-2); } temp=temp*y[x]; p=p+temp; } Polynomial x(0);x[1]=1; Polynomial re(1); for(int i=strlen(s)-1;~i;i--) { if(s[i]=='1') re=re*x%p; x=x*x%p; } memset(b,0,sizeof b); for(int i=1;i<=n;i++) b[i][i]=1; for(int k=0;k<n;k++) { for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) (ans[i][j]+=(long long)b[i][j]*re[k]%MOD)%=MOD; static int c[M][M]; memset(c,0,sizeof c); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) for(int k=1;k<=n;k++) (c[i][j]+=(long long)a[i][k]*b[k][j]%MOD)%=MOD; memcpy(b,c,sizeof b); } for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) printf("%d%c",ans[i][j],j==n?'\n':' '); return 0;}
0 0
- BZOJ 4162 shlw loves matrix II 拉格朗日插值+Cayley-Hamilton定理
- Cayley-Hamilton定理证明
- BZOJ 4161 Shlw loves matrixI
- bzoj4161 Shlw loves matrixI
- [bzoj4161]Shlw loves matrixI
- NYOJ 127 cayley定理
- BZOJ 3569 DZY Loves Chinese II 高斯消元
- bzoj 3569: DZY Loves Chinese II
- BZOJ 3569: DZY Loves Chinese II
- 【学习总结】数学-cayley定理
- 致凯利定理(Cayley公式)
- BZOJ 3569 DZY Loves Chinese(BZOJ 3563) II 线性基
- BZOJ 3563 DZY Loves Chinese / BZOJ 3569 DZY Loves Chinese II 随机化+高斯消元解异或方程组
- Cayley n顶点树数定理
- UVA 10843 - Anne's game(Cayley定理)
- UVA 10843 Anne's game (Cayley定理)
- Cayley定理在组合数学中的应用
- [bzoj 3563&3569]DZY Loves Chinese I&II
- iOS网页-JS交互(UIWebView)
- 数组的常用操作
- chrome打包扩展程序为crx
- windows进程抓包工具QPA初体验
- 17. Contoller(2)
- BZOJ 4162 shlw loves matrix II 拉格朗日插值+Cayley-Hamilton定理
- 为什么推荐把<script>元素写在body里面
- markdown初识
- Bandwagon(搬瓦工)再vps上配置ssh和vpn(ipsec)还有ssh加速(FinalSpeed配置)
- 论文_四象限_整流回馈_原理
- 51Nod-1196-字符串的数量
- android:如何提高软件性能
- 如何学好3D引擎编程
- Java-获得内网所有的IP地址