矩阵快速幂求助
  • 板块学术版
  • 楼主DFSer
  • 当前回复4
  • 已保存回复4
  • 发布时间2022/8/9 16:48
  • 上次更新2023/10/27 16:16:20
查看原帖
矩阵快速幂求助
189314
DFSer楼主2022/8/9 16:48

原题传送门

刚刚接触矩阵乘法和快速幂的蒟蒻,又一次听取WA声一片(全WA)

代码附上,样例能过,测试点全挂

求dalao/神犇帮助

#include <iostream>
#include <cstdio>

using namespace std;

long long n,k;

const long long mod = 1e9+7;

struct square{
	long long a[110][110];
	long long len;
	square(long long k){
		len = k;
	}
	
	void read(){
		for(long long i = 1;i<=len;i++){
			for(long long j = 1;j<=len;j++){
				scanf("%d",&a[i][j]);
			}
		}
	}
	
	void print(){
		for(long long i = 1;i<=len;i++){
			for(long long j = 1;j<=len;j++){
				printf("%d ",a[i][j]);
			}
			puts("");
		}
	}
	
	friend square operator*(square x,square y){
		square c(n);
		long long l = x.len;
		for(long long i = 1;i<=l;i++){
			for(long long j = 1;j<=l;j++){
				for(long long k = 1;k<=l;k++){
					c.a[i][j]+=(x.a[i][k]*y.a[k][j])%mod;
					c.a[i][j]%=mod;
				}
			}
		}
		return c;
	}
};

square fast_pow(square p,long long q){
	square ans(n);
	for(int i = 1;i<=ans.len;i++)ans.a[i][i] = 1;
	square b = p;
	while(q){
		if(q&1ll)ans=ans*b;
		b=b*b;
		q>>=1ll;
	}
	return ans;
}

int main(){
	scanf("%d%d",&n,&k);
	square asd(n);
	asd.read();
	square bsd = fast_pow(asd,k);
	bsd.print();
	return 0;
}
2022/8/9 16:48
加载中...