pku3233 Matrix Power Series

来源:互联网 发布:linux中没有yum命令 编辑:程序博客网 时间:2024/05/02 04:49

差点以为是秦九韶+矩阵的某种优化

然而这是不可能的= =

我们联想到秦九韶的方法,但是我们不提出来那么多次不就行了!

所以我们考虑二分

如果k为偶数,那么(A+A^2+....A^K) = (A+...+A^K/2)+A^K/2*(A+...+A^K/2)

如果k为奇数,那么(A+A^2+....A^K) = (A+...+A^K/2)+A^K/2*(A+...+A^K/2)+A^k

然后……递归就行= =

然而翻了下Status= =发现非常的慢!大概优化就是改成递推之类的然后就能省去很多计算

或者是换元整理出一个新的矩阵然后直接快速幂

然而窝并不会= =以上就当窝天真单纯的想法

Problem: 3233User: BPM136Memory: 1544KTime: 1532MSLanguage: G++Result: Accepted#include<iostream>#include<cstdio>#include<cmath>#include<cstring>#include<cstdlib>#include<algorithm>#define LL long long#define fo(i,a,b) for(int i=a;i<=b;i++)#define down(i,a,b) for(int i=a;i>=b;i--)using namespace std;inline LL read(){LL d=0,f=1;char s=getchar();while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}while(s>='0'&&s<='9'){d=d*10+s-'0';s=getchar();}return d*f;}#define N 30int n,m,inf;struct matrix{int a[N][N];void clear(){memset(a,0,sizeof(a));}void OUT(){fo(i,0,m-1){fo(j,0,m-1)cout<<a[i][j]<<' ';cout<<endl;}cout<<endl;}matrix operator*(const matrix b)const{matrix anss;fo(i,0,m-1)fo(j,0,m-1){anss.a[i][j]=0;fo(k,0,m-1){anss.a[i][j]+=a[i][k]*b.a[k][j];anss.a[i][j]%=inf;}}return anss;}matrix operator+(const matrix b)const{matrix anss;fo(i,0,m-1)fo(j,0,m-1){anss.a[i][j]=a[i][j]+b.a[i][j];anss.a[i][j]%=inf;}return anss;}};matrix I;void getI(){fo(i,0,m-1)fo(j,0,m-1)if(i==j)I.a[i][j]=1;else I.a[i][j]=0;}matrix KSM(matrix a,int b){if(b==0)return I;if(b==1)return a;matrix ret=KSM(a,b/2);ret=ret*ret;if(b%2)ret=ret*a;return ret;}matrix calc(matrix a,int b){if(b==0)return I;if(b==1)return a;matrix anss=calc(a,b/2);matrix ct=KSM(a,b/2);if(b%2){matrix t=KSM(a,b);return anss+ct*anss+t;}else return anss+ct*anss;}int main(){matrix A,ans;m=read(),n=read(),inf=read();getI();fo(i,0,m-1)fo(j,0,m-1)A.a[i][j]=read();calc(A,n).OUT();return 0;}




0 0