简单矩阵,求调
查看原帖
简单矩阵,求调
580202
Siegerkranz_2735楼主2024/5/9 17:37

没过样例,ou函数是输出矩阵检测用的

#include<bits/stdc++.h>
using namespace std;
struct matrix{
	int m[55][55],x,y;
	matrix(){x=0;y=0;memset(m,0,sizeof(m));}
	inline void init(){memset(m,0,sizeof(m));for(int i=0;i<=x;i++)m[i][i]=1;}
}now,f[14];
int n,m,s,e,k,nfish;
matrix ti(matrix a,matrix b){
	matrix c;c.x=b.x,c.y=a.y;
	for(int i=1;i<=a.y;i++){
		for(int j=1;j<=b.x;j++){
			for(int k=1;k<=a.x;k++){
				c.m[i][j]=(c.m[i][j]+(a.m[i][k]%10000)*(b.m[k][j]%10000))%10000;
			}
		}
	}
	return c;
}
matrix pow_m(matrix a,int k){
	matrix ans;ans.x=ans.y=a.x;ans.init();
	while(k){if(k&1){ans=ti(ans,a);}k>>=1;a=ti(a,a);}
	return ans;
}
void ou(matrix a){
	for(int i=1;i<=a.x;i++){
		for(int j=1;j<=a.y;j++){
			cout<<a.m[i][j]<<"  ";
		}
		cout<<endl;
	}
}
int main(){
	cin>>n>>m>>s>>e>>k;
	now.x=now.y=n;
	for(int i=1,x,y;i<=m;i++){
		cin>>x>>y;
		now.m[x+1][y+1]=now.m[y+1][x+1]=1;
	}
	cin>>nfish;
	for(int i=1;i<=12;i++)f[i]=now;
	for(int i=1,t;i<=nfish;i++){
		cin>>t;
		for(int j=1,now;j<=t;j++){
			cin>>now;now++;
			for(int k=j;k<=12;k+=t){
				for(int l=1;l<=n;l++){
					f[k].m[l][now]=0;
				}
			}
		}
	}
	f[13]=f[1]; now.init();
	for(int i=2;i<=12;i++)f[13]=ti(f[13],f[i]);
	now=pow_m(f[13],k/12);
	for(int i=1;i<=k%12;i++){
		now=ti(now,f[i]);
	}
	cout<<now.m[s+1][e+1];
	return 0;
}
2024/5/9 17:37
加载中...