ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#203386 | #3560. 小院闲窗春色深 | mikefeng | 100 | 1531ms | 6148kb | C++11 | 3.9kb | 2024-02-24 11:05:06 | 2024-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