UVA 11149 Power of Matrix 倍增法
来源:互联网 发布:淘宝美工怎么优化店铺 编辑:程序博客网 时间:2024/04/29 05:26
#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;#define maxn 44#define mod 10int n;struct matrix{ int f[maxn][maxn];};matrix sum(matrix a,matrix b){ int i,j; matrix s; for(i=0;i<n;i++) for(j=0;j<n;j++) s.f[i][j]=(a.f[i][j]+b.f[i][j])%mod; return s;}matrix mul(matrix a,matrix b){ int i,j,k; matrix s; memset(s.f,0,sizeof(s.f)); for(i=0;i<n;i++) for(j=0;j<n;j++) for(k=0;k<n;k++) s.f[i][j]=(s.f[i][j]+a.f[i][k]*b.f[k][j])%mod; return s;}matrix pows(matrix e,int b){ matrix s,a; int i,j,k; a=e; for(i=0;i<n;i++) for(j=0;j<n;j++) if(i==j)s.f[i][j]=1; else s.f[i][j]=0; while(b) { if(b&1) s=mul(s,a); a=mul(a,a); b=b>>1; } return s;}matrix work(matrix e,int k){ matrix s,a,b; if(k==1) return e; a=work(e,k/2); s=sum(a,mul(a,pows(e,k/2))); if(k&1) s=sum(s,pows(e,k)); return s;}int main(){ int k; while(cin>>n>>k) { if(n==0)//坑啊,习惯的写成if(n==0&&k==0)break;。。。 break; int i,j,a; matrix e; for(i=0;i<n;i++) { for(j=0;j<n;j++) { cin>>a; e.f[i][j]=a%10; } } e=work(e,k); for(i=0;i<n;i++) { cout<<e.f[i][0]; for(j=1;j<n;j++) cout<<" "<<e.f[i][j]; cout<<endl; } cout<<endl; } return 0;}/* 倍增法 a+a^2+a^3+a^4+a^5=(a+a^2)+a^2*(a+a^2)+a^5(5为奇数),a+a^2=a+a*(a)(2为偶数) 或则k=100=1010B,s=0 从左到右,当为1,s=s*2+1;否则s=s*2 a+a^2+a^3+...+a^10:(个数变化) 1:a 0:a+a^2=a+a*(a); 1:a+a^2+a^3+a^4+a^5=(a+a^2)+a^2*(a+a^2)+a^5 0:a+a^2+...^a^10=(a+a^2+...+a^5)+a^5*(a+a^2+...+a^5)*/