UOJ Logo

NOI.AC

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#203386#3560. 小院闲窗春色深mikefeng1001531ms6148kbC++113.9kb2024-02-24 11:05:062024-02-24 13:04:41

answer

bool M1;
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<climits>
#include<iomanip>
#include<cassert>
#include<random>
#include<cstdio>
#include<vector>
#include<bitset>
#include<stack>
#include<queue>
#include<deque>
#include<cmath>
#include<ctime>
#include<map>
#include<set>
//#include<ext/pb_ds/assoc_container.hpp>
//#include<ext/pb_ds/hash_policy.hpp>
//#include<ext/pb_ds/priority_queue.hpp>
#define fi first
#define se second
#define LD double
#define ll long long
#define Vector Point
#define I128 __int128
#define ull unsigned ll
#define pii pair<int,int>
#define pb(x) push_back(x)
#define syt cerr<<"sytakioi\n"
#define F(i,a,b) for(int i=a,i##end=b;i<=i##end;++i)
#define UF(i,a,b) for(int i=a,i##end=b;i>=i##end;--i)
#define look_memory cerr<<abs(&M2-&M1)/1024.0/1024<<'\n'
#define rd_i(l,r) uniform_int_distribution<int>(l,r)(rd)
#define rd_r(l,r) uniform_real_distribution<double>(l,r)(rd)
#define look_time cerr<<(clock()-Time)*1.0/CLOCKS_PER_SEC<<'\n'
using namespace std;
//using namespace __gnu_cxx;
mt19937 rd(time(0));
const int N=405;
const int p=998244353;
inline ll qpow(ll x,int a){
	x=max(x,0ll);
	ll ans=1;
	for(;a;x=x*x%p,a>>=1) if(a&1) ans=ans*x%p;
	return ans;
}
int T,n,m;
int id[N],fa[N],siz[N];
inline int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
int a[N][N],b[N][N],dis[N][N],num[N][N];
inline void floyed(){
	F(k,1,n) F(i,1,n) F(j,1,n) if((i^k)&&(j^k)){
		if(dis[i][j]>dis[i][k]+dis[k][j]) dis[i][j]=dis[i][k]+dis[k][j],num[i][j]=min(num[i][k]*num[k][j],2);
		else if(dis[i][j]==dis[i][k]+dis[k][j]) num[i][j]=min(num[i][j]+num[i][k]*num[k][j],2);
	}
}
struct node{
	int i,j,x;
	node(int _i,int _j,int _x):i(_i),j(_j),x(_x){}
};
ll fac[N],inv[N];
inline void init(int n){
	fac[0]=1;F(i,1,n) fac[i]=fac[i-1]*i%p;
	inv[n]=qpow(fac[n],p-2);UF(i,n,1) inv[i-1]=inv[i]*i%p;
}
inline ll C(int n,int m){return fac[n]*inv[m]%p*inv[n-m]%p;}
ll f[N],g[N];
inline void mian(){
	cin>>n>>m;
	F(i,1,n){
		f[i]=qpow(m+1,i*(i-1)/2);
		F(j,1,i-1) (f[i]-=f[j]*C(i-1,j-1)%p*qpow(m+1,(i-j)*(i-j-1)/2)%p*qpow(m,j*(i-j)))%=p;
	}
	F(i,1,n){
		g[i]=qpow(m,i*(i-1)/2);
		F(j,1,i-1) (g[i]-=g[j]*C(i-1,j-1)%p*qpow(m,(i-j)*(i-j-1)/2)%p*qpow(m-1,j*(i-j)))%=p;
	}
	F(i,1,n) F(j,1,n) cin>>a[i][j];
//	if(212-T==42){
//		cerr<<n<<' '<<m<<'\n';
//		F(i,1,n){
//			F(j,1,n) cerr<<a[i][j]<<' ';
//			cerr<<'\n';
//		}
//	}
	F(i,1,n) F(j,1,n) if(a[i][j]!=a[j][i]) return void(cout<<"0\n");
	F(i,1,n) fa[i]=i,siz[i]=1;
	F(i,1,n) F(j,i+1,n) if(!a[i][j]&&find(i)!=find(j)) siz[find(j)]+=siz[find(i)],fa[find(i)]=find(j);
	F(i,1,n) F(j,1,n) if(a[i][j]!=a[find(i)][j]) return void(cout<<"0\n");
	int cnt=0,sum=0;
	F(i,1,n) if(find(i)==i) id[++cnt]=i,sum+=siz[i];
	assert(sum==n);
	n=cnt;
	F(i,1,n) F(j,1,n) b[i][j]=a[id[i]][id[j]];
	F(i,1,n) F(j,1,n) dis[i][j]=b[i][j],num[i][j]=1;
	floyed();
	F(i,1,n) F(j,1,n) if(dis[i][j]!=b[i][j]) return void(cout<<"0\n");
	vector<node> v;
	F(i,1,n) F(j,i+1,n) v.emplace_back(i,j,b[i][j]);
	sort(v.begin(),v.end(),[&](node x,node y){return x.x<y.x;});
//	F(i,1,n){
//		F(j,1,n) cout<<num[i][j]<<' ';
//		cout<<'\n';
//	}
	ll ans=1,res=1;
	F(i,1,n) ans=ans*f[siz[id[i]]]%p,res=res*g[siz[id[i]]]%p;
//	F(i,1,n) cout<<siz[id[i]]<<' ';cout<<'\n';
	for(node x:v){
		if(num[x.i][x.j]>1){
			ans=ans*qpow(m-b[x.i][x.j]+1,siz[id[x.i]]*siz[id[x.j]])%p;
			res=res*qpow(m-b[x.i][x.j],siz[id[x.i]]*siz[id[x.j]])%p;
		}else{
			ans=ans*(qpow(m-b[x.i][x.j]+1,siz[id[x.i]]*siz[id[x.j]])-qpow(m-b[x.i][x.j],siz[id[x.i]]*siz[id[x.j]]))%p;
			res=res*(qpow(m-b[x.i][x.j],siz[id[x.i]]*siz[id[x.j]])-qpow(m-b[x.i][x.j]-1,siz[id[x.i]]*siz[id[x.j]]))%p;
		}
	}
	cout<<((ans-res)%p+p)%p<<'\n';
}
bool M2;
int main(){
	int Time=clock();
	look_memory;
//	freopen("ex_amber8.in","r",stdin);
//	freopen("1.out","w",stdout);
	cin.tie(nullptr)->sync_with_stdio(false);
	init(400);
	cin>>T;
	while(T--) mian();
	look_time;
	return 0;
}

Details

小提示:点击横条可展开更详细的信息

Test #1:

score: 10
Accepted
time: 0ms
memory: 1412kb

input:

204
3 3
0 2 1
2 0 3
1 3 0
3 5
0 3 4
3 0 1
4 1 0
4 5
0 1 1 3
1 0 2 4
1 2 0 4
3 4 4 0
4 5
0 2 3 3
2 0 ...

output:

1
1
13
1
4
4
0
0
18
7
0
1
1
0
2
0
13
0
4
4
0
18
7
0
0
1
0
1
1
3
0
0
1
0
1
1
1
1
1
1
1
1
0
1
1
0
0
1
...

result:

ok 204 numbers

Test #2:

score: 10
Accepted
time: 8ms
memory: 1664kb

input:

20
36 744373192
0 9312648 15440508 12836339 12090822 11814833 6490999 13847739 7862103 20584369 8561...

output:

661143199
508590528
837677780
135769368
10300994
164629851
853271557
642677104
785643498
837491821
9...

result:

ok 20 numbers

Test #3:

score: 5
Accepted
time: 262ms
memory: 6144kb

input:

2
400 1000000000
0 13808551 19328904 17405838 21149586 15404044 7866869 11422830 12942958 21193652 1...

output:

626881850
344046232

result:

ok 2 number(s): "626881850 344046232"

Test #4:

score: 5
Accepted
time: 259ms
memory: 6148kb

input:

2
400 1000000000
0 14770595 11960705 14167217 16875028 4062400 16938709 10974424 14779359 10201441 1...

output:

831783370
613181630

result:

ok 2 number(s): "831783370 613181630"

Test #5:

score: 5
Accepted
time: 253ms
memory: 6148kb

input:

2
400 1000000000
0 19670766 11305909 13777445 13208147 10981829 14581204 14947677 23051829 11830974 ...

output:

459514299
868236763

result:

ok 2 number(s): "459514299 868236763"

Test #6:

score: 5
Accepted
time: 268ms
memory: 6144kb

input:

2
400 1000000000
0 17723139 18222708 16934888 13023334 20268472 16395805 16596042 18027449 18601832 ...

output:

36755219
682293912

result:

ok 2 number(s): "36755219 682293912"

Test #7:

score: 20
Accepted
time: 68ms
memory: 2028kb

input:

2
398 1
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ...

output:

269676500
218314154

result:

ok 2 number(s): "269676500 218314154"

Test #8:

score: 20
Accepted
time: 4ms
memory: 1516kb

input:

20
31 606668000
0 63776809 28098165 18927177 45964474 59245929 45964474 63776809 59245929 32851078 4...

output:

723771478
894028931
807934521
338045047
445442568
155627530
884657725
979980638
214630018
56377231
8...

result:

ok 20 numbers

Test #9:

score: 5
Accepted
time: 99ms
memory: 3456kb

input:

2
400 1000000000
0 9493556 3729536 15672132 6459545 6567649 4203273 2659943 8338120 3764957 5839726 ...

output:

23513587
596758462

result:

ok 2 number(s): "23513587 596758462"

Test #10:

score: 5
Accepted
time: 104ms
memory: 3508kb

input:

2
400 1000000000
0 4548100 5592201 6703474 1939013 2274200 1382749 2099318 2755020 2618761 3211869 6...

output:

257976477
541722834

result:

ok 2 number(s): "257976477 541722834"

Test #11:

score: 5
Accepted
time: 106ms
memory: 3500kb

input:

2
400 1000000000
0 14681334 8111719 7636981 10525492 5749614 10040863 8111719 9502166 7228179 811171...

output:

362571923
270871151

result:

ok 2 number(s): "362571923 270871151"

Test #12:

score: 5
Accepted
time: 100ms
memory: 3396kb

input:

2
400 1000000000
0 1294054 4015981 4550486 1232581 2472119 5603920 3007990 7944606 1294054 5346303 3...

output:

364141400
649756260

result:

ok 2 number(s): "364141400 649756260"

Extra Test:

score: 0
Extra Test Passed