WA求助 k一大就return 3221225725
查看原帖
WA求助 k一大就return 3221225725
295864
eigw22h619楼主2021/10/15 11:03

当矩阵中元素大小较大时重载的 * 不能正常退出了 源代码: (不是文件输入的问题)

#include<bits/stdc++.h>
using namespace std;
const int N=101,M=1000000007;
struct juzhen
{
	unsigned long long a[N][N],x=0,y=0;
	friend juzhen operator * (juzhen a,juzhen b)
	{//重载的矩阵乘法
		juzhen c;
		if(a.y!=b.x)return c;
		memset(c.a,0,sizeof(c));
		c.x=a.x;c.y=b.y;
		for(int i=1;i<=c.x;i++)
		for(int j=1;j<=c.y;j++)
		for(int k=1;k<=a.y;k++)
		c.a[i][j]=(c.a[i][j]+(a.a[i][k]*b.a[k][j])%M)%M;
		return c;
	}
	static juzhen fp(juzhen a,long long p)
	{//快速幂
		juzhen c;
		if(a.x!=a.y)return c;
		if(p==1)return a;
		c.x=a.x;c.y=a.y;
		if(p==0)
		{
			memset(c.a,0,sizeof(c.a));
			for(int i=1;i<=c.x;i++)
			c.a[i][i]=1;
			return c;
		}
		if(p%2!=0)c=a*fp(a*a,(p-1)/2);
		else c=fp(a*a,p/2);
		return c;
	}
	void reada()
	{
		for(int i=1;i<=x;i++)
		for(int j=1;j<=y;j++)
		cin>>a[i][j];
		return ;
	}
	void writea()
	{
		for(int i=1;i<=x;i++)
		{
			for(int j=1;j<=y;j++)
			printf("%lld ",a[i][j]);
			printf("\n");
		}
		return ;
	}
}A;
int main()
{
	ios::sync_with_stdio(false);
	freopen("3390.in","r",stdin);
	int n,k;cin>>n>>k;
	A.x=n;A.y=n;
	A.reada();
	juzhen c=juzhen::fp(A,k);
	c.writea();
	return 0;
}
2021/10/15 11:03
加载中...