一个小小的疑问
查看原帖
一个小小的疑问
499231
Jacky2009楼主2022/3/1 00:53

以下是我的AC代码:

#include<bits/stdc++.h>
using namespace std;
#define int long long
int mod=1000000007;
struct mat{
	int li[105][105];
};
mat ma;
int n=3,p;
mat operator *( mat x, mat y){     
	mat z;
	memset(z.li,0,sizeof(z.li));
	for(int k=1;k<=n;++k)
		for(int i=1;i<=n;++i)
			for(int j=1;j<=n;++j)
				z.li[i][j]=(z.li[i][j]+x.li[i][k]*y.li[k][j]%mod)%mod;
	return z;
}
void print(mat x){
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			cout<<x.li[i][j]<<" ";
		}
		cout<<endl;
	}
}
mat qp(mat x,int p){
	mat ans=x;
	int q=p;
	while(q){
		if(q%2){
			ans=ans*x;
		}
		q/=2;
		x=x*x;
	}
	return ans;
}
signed main(){
	int t;
	cin>>t;
	while(t--){
		cin>>p;
		int q=p;
		memset(ma.li,0,sizeof(ma.li));
		int lis[4][4]={{0,0,0,0},{0,1,1,1},{0,0,1,1},{0,1,1,2}};
		for(int i=1;i<=n;i++){
			for(int j=1;j<=n;j++)ma.li[i][j]=lis[i][j];
		}
		mat ma2=qp(ma,(p-1)/3);
		int a,b,c;
	//	print(ma2);
		if(q%3==1)cout<<ma2.li[1][1]<<endl;
		if(q%3==2)cout<<ma2.li[1][2]<<endl;
		if(q%3==0)cout<<ma2.li[1][3]<<endl;
	}
	
}

注意

memset(z.li,0,sizeof(z.li));

这一行.


重载运算符时,如果删掉这一句,则会出现各种莫名其妙的特性(如算两次AB结果不同)


请问为什么呢?? (蒟蒻SOS,SOS......)

2022/3/1 00:53
加载中...