简单矩乘 WA 20pts 求调
查看原帖
简单矩乘 WA 20pts 求调
511609
无钩七不改名楼主2023/9/9 11:31

K>=12 就有问题了,但是不知道为什么,找不到问题。

https://www.luogu.com.cn/record/124166457

#include<bits/stdc++.h>
using namespace std;

const int N=55,mod=10000;

int n,m,st,en,K;
int dnt[15][N];
vector<int> g[N];
long long t[15][N][N];

int read(){
	int f=1,k=0;
	char c=getchar();
	while(c<'0'||c>'9'){
		if(c=='-')f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		k=k*10+c-'0';
		c=getchar();
	}
	return f*k;
}

long long a[N],b[N][N];
long long c[N],d[N][N];

int main(){
	n=read();m=read();
	st=read();en=read();K=read();
	for(int i(1);i<=m;++i){
		int u=read(),v=read();
		g[u].push_back(v);
		g[v].push_back(u);
	}
	int nfi=read();
	for(int i(1);i<=nfi;++i){
		int T=read(),p[5];
		for(int j(0);j<T;++j){
			p[j]=read();
			for(int k(j);k<12;k+=T)dnt[k][p[j]]=1;
		}
	}
	for(int i(0);i<n;++i)if(!dnt[0][i])t[0][i][i]=1;
	for(int T(1);T<12;++T)
		for(int i(0);i<n;++i)
			for(int x(0);x<n;++x){
				if(dnt[T-1][x])continue;
				for(int v:g[x])
					if(!dnt[T][v])
						t[T][i][v]=(t[T][i][v]+t[T-1][i][x])%mod;
			}
	int x=K/12;
	a[st]=1;
	memcpy(b,t[11],sizeof b);
	while(x){
		if(x&1){
			memset(c,0,sizeof c);
			for(int j(0);j<n;++j)
				for(int k(0);k<n;++k)
					c[j]=(c[j]+a[k]*b[k][j]%mod)%mod;
			memcpy(a,c,sizeof a);
		}
		memset(d,0,sizeof d);
		for(int i(0);i<n;++i)
			for(int j(0);j<n;++j)
				for(int k(0);k<n;++k)
					d[i][j]=(d[i][j]+b[i][k]*b[k][j]%mod)%mod;
		memcpy(b,d,sizeof b);
		x>>=1;
	}
	x=K%12;
	memset(c,0,sizeof c);
	for(int j(0);j<n;++j)
		for(int k(0);k<n;++k)
			c[j]=(c[j]+a[k]*t[x][k][j]%mod)%mod;
	memcpy(a,c,sizeof a);
	printf("%lld",a[en]);
	return 0;
}

thx qwq

2023/9/9 11:31
加载中...