「模板」矩阵快速幂

<题目链接>

大幅度照抄队友的,觉着自己有些侵权,不大好意思发。

原版,戳友链第一个……

然而还是不要脸地发一个。

#include <cstdio>
#include <cstring>
const int MAXN=110,p=1e9+7;
int n;
long long k;
class matrix
{
	public:
		matrix(void)
		{
			memset(c,0,sizeof c);
		}
		void Read(void)
		{
			for(int i=1;i<=n;++i)
				for(int j=1;j<=n;++j)
					scanf("%lld",&c[i][j]);
		}
		void Print(void)
		{
			for(int i=1;i<=n;++i)
			{
				for(int j=1;j<=n;++j)
					printf("%lld ",c[i][j]);
				printf("\n");
			}
		}
		void Pow(long long k)
		{
			matrix a=(*this),ans;
			for(int i=1;i<=n;++i)
				ans.c[i][i]=1;
			while(k)
			{
				if(k&1LL)
					ans=ans*a;
				a=a*a;
				k>>=1;
			}
			memcpy(c,ans.c,sizeof ans.c);
		}
		matrix operator *(const matrix &b) const
		{
			matrix t,a=(*this);
			for(int i=1;i<=n;++i)
				for(int j=1;j<=n;++j)
				{
					t.c[i][j]=0;
					for(int k=1;k<=n;++k)
						(t.c[i][j]+=a.c[i][k]*b.c[k][j])%=p;
				}
			return t;
		}
	private:
		long long c[MAXN][MAXN];
}s;
int main(int argc,char *argv[])
{
	scanf("%d %lld",&n,&k);
	s.Read();
	s.Pow(k);
	s.Print();
	return 0;
}

感谢队友的不控诉之恩。

posted @ 2017-12-19 15:44  Capella  阅读(112)  评论(2编辑  收藏  举报

谢谢光临