用户工具

站点工具


2020-2021:teams:no_morning_training:weekly:week9

2020/07/25--2020/07/31


团队训练

暂无


王瑞琦

比赛

专题

冯宇扬

比赛

cf 659 div 2
cf 660 div 2

常程

比赛

专题

摸了


本周推荐

王瑞琦

写了一道矩阵快速幂的模板题。

来源

标签

数学,矩阵乘法

题意

给出一个n*n的矩阵,计算其的k次方

题解

对矩阵运用快速幂=。=
快速幂:
对于n的k次方,可以不需要计算k次,只需计算出n^(k/2),然后再开方即可(对于k为奇的情况要再乘一个n)
可以将复杂度降到O(logn)

代码

代码

#include <stdio.h>
#define p 1000000007
struct matrix{
	long long m[101][101];
};
typedef struct matrix Matrix;
long long n;
 
Matrix work(Matrix a,Matrix b)
{
	Matrix tmp;
	for (long long i=1;i<=n;i++)
		for (long long j=1;j<=n;j++)
		{
			tmp.m[i][j]=0;
			for (long long k=1;k<=n;k++)
				tmp.m[i][j]=(tmp.m[i][j]+a.m[i][k]*b.m[k][j])%p;
		}
	return tmp;
}
 
Matrix ksm(Matrix a,long long m)
{
	Matrix tmp=a,b=a;
	m--;
	while (m>0)
	{
		if (m%2==1) tmp=work(b,tmp);
		b=work(b,b);
		m=m/2;
	}
	return tmp;
}
 
int main()
{
	long long k;
	Matrix a;
	scanf("%lld%lld",&n,&k);
	for (long long i=1;i<=n;i++)
		for (long long j=1;j<=n;j++) scanf("%lld",&a.m[i][j]);
	a=ksm(a,k);
	for (long long i=1;i<=n;i++)
	{
		for (long long j=1;j<=n;j++)
			printf("%lld ",a.m[i][j]);
		printf("\n");
	}
	return 0;
}

comment

一道模板题。矩阵快速幂的运用范围还是挺广的。

冯宇扬

cf 660 div 2

常程

本周摸了

2020-2021/teams/no_morning_training/weekly/week9.txt · 最后更改: 2020/07/31 16:15 由 发源于