Submission #39102934


Source Code Expand

#include<bits/stdc++.h>
using namespace std;
const int N=88,mod=998244353;

int ksm(int a,int x){
	int tot=1;
	while(x){
		if(x&1) tot=1ll*tot*a%mod;
		a=1ll*a*a%mod;
		x>>=1ll;
	}
	return tot;
} 
int C[N][N];
void init(int lim){
	for(int i=0;i<=lim;i++){
		C[i][0]=1;
		for(int j=1;j<=i;j++) C[i][j]=(C[i-1][j-1]+C[i-1][j])%mod;
	}
}
int ID(int x){
	return (x & 1ll)?mod-1:1;
}

int a[N][N];
int det(int a[N][N],int n){
	int tot=1;
	for(int k=1;k<=n;k++){
		int st=0;
		for(int i=k;i<=n;i++){
			if(a[i][k]){
				st=i;
				break;
			}
		}
		if(!st) return 0;
		for(int j=1;j<=n;j++) swap(a[k][j],a[st][j]);
		if(st!=k) tot=mod-tot;
		for(int i=k+1;i<=n;i++){
			int t=1ll*a[i][k]*ksm(a[k][k],mod-2)%mod;
			for(int j=k;j<=n;j++) a[i][j]=(a[i][j]+mod-1ll*a[k][j]*t%mod)%mod;
		}
		tot=1ll*tot*a[k][k]%mod;
	}
	return tot;
}

int n,m,ans;
int f[N][N],f_[N][N];

int val[N][N];

int F[N][N],G[N][N],S[N][N];

int main(){
	init(N-5);
	cin>>n>>m;
	
	for(int T=1;T<=2;T++){
		memset(f,0,sizeof(f));
		memset(f_,0,sizeof(f_));
		memset(F,0,sizeof(F));
		memset(G,0,sizeof(G));
		memset(S,0,sizeof(S));
		
		int k=n+m;
		
		for(int i=1;i<=m;i++)
			for(int j=1;j<=n;j++)
				f[i][j]=C[i-1+j-1][i-1];
		for(int i=1;i<=m;i++){
			if(i>1) f_[i][i+n]=1;
			for(int j=1;j<=i;j++)
				f[i][j+n]=C[i-j+n-1][n-1];
		}
		for(int i=1;i<=n;i++){
			f_[i+m][i]=1;
			for(int j=i;j<=n;j++)
				f[i+m][j]=C[j-i+m-1][m-1];
		}
		for(int i=1;i<=n;i++)
			for(int j=1;j<=m;j++)
				f[i+m][j+n]=C[n-i+m-j][n-i];
		
		for(int x=0;x<=n;x++){
			for(int y=0;y<=m;y++){
				for(int i=1;i<=k;i++)
					for(int j=1;j<=k;j++){
						if(i<=m) a[i][j]=(1ll*f[i][j]*y%mod+f_[i][j])%mod;
						else a[i][j]=(1ll*f[i][j]*x%mod+f_[i][j])%mod;
					}
				val[x][y]=det(a,k);
			}
		}
		
		for(int i=0;i<=n;i++){
			F[i][0]=1;
			int val=1;
			for(int j=0;j<=n;j++){
				if(j==i) continue;
				for(int t=n;t>=0;t--){
					F[i][t]=1ll*(mod-j)*F[i][t]%mod;
					if(t) F[i][t]=(F[i][t]+F[i][t-1])%mod;
				}
				val=1ll*val*ksm(i+mod-j,mod-2)%mod;
			}
			for(int t=0;t<=n;t++) F[i][t]=1ll*F[i][t]*val%mod;
		}
		
		for(int i=0;i<=m;i++){
			G[i][0]=1;
			int val=1;
			for(int j=0;j<=m;j++){
				if(j==i) continue;
				for(int t=m;t>=0;t--){
					G[i][t]=1ll*(mod-j)*G[i][t]%mod;
					if(t) G[i][t]=(G[i][t]+G[i][t-1])%mod;
				}
				val=1ll*val*ksm(i+mod-j,mod-2)%mod;
			}
			for(int t=0;t<=m;t++) G[i][t]=1ll*G[i][t]*val%mod; 
		}
		
		for(int x=0;x<=n;x++){
			for(int y=0;y<=m;y++){
				for(int i=0;i<=n;i++){
					for(int j=0;j<=m;j++){
						S[i][j]=(S[i][j]+1ll*val[x][y]*F[x][i]%mod*G[y][j]%mod)%mod;
					}
				}
			}
		}
		
		for(int i=0;i<=n;i++){
			for(int j=0;j<=m;j++){
				if(__gcd(i,j)==1) ans=(ans+1ll*S[i][j]*ID(n*m-i*j)%mod)%mod;
			}
		}
		
		swap(n,m);
	}
	
	cout<<ans;
} 

Submission Info

Submission Time
Task F - Perfect Strings
User Appleblue17
Language C++ (GCC 9.2.1)
Score 2000
Code Size 2896 Byte
Status AC
Exec Time 2726 ms
Memory 3828 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 2000 / 2000
Status
AC × 3
AC × 38
Set Name Test Cases
Sample 01.txt, 02.txt, 03.txt
All 01.txt, 02.txt, 03.txt, 04.txt, 05.txt, 06.txt, 07.txt, 08.txt, 09.txt, 10.txt, 11.txt, 12.txt, 13.txt, 14.txt, 15.txt, 16.txt, 17.txt, 18.txt, 19.txt, 20.txt, 21.txt, 22.txt, 23.txt, 24.txt, 25.txt, 26.txt, 27.txt, 28.txt, 29.txt, 30.txt, 31.txt, 32.txt, 33.txt, 34.txt, 35.txt, 36.txt, 37.txt, 38.txt
Case Name Status Exec Time Memory
01.txt AC 8 ms 3788 KiB
02.txt AC 3 ms 3696 KiB
03.txt AC 650 ms 3748 KiB
04.txt AC 3 ms 3788 KiB
05.txt AC 3 ms 3692 KiB
06.txt AC 4 ms 3764 KiB
07.txt AC 2 ms 3620 KiB
08.txt AC 4 ms 3584 KiB
09.txt AC 3 ms 3744 KiB
10.txt AC 2 ms 3584 KiB
11.txt AC 5 ms 3700 KiB
12.txt AC 4 ms 3584 KiB
13.txt AC 3 ms 3756 KiB
14.txt AC 5 ms 3700 KiB
15.txt AC 9 ms 3732 KiB
16.txt AC 2 ms 3768 KiB
17.txt AC 4 ms 3744 KiB
18.txt AC 6 ms 3752 KiB
19.txt AC 5 ms 3768 KiB
20.txt AC 7 ms 3768 KiB
21.txt AC 37 ms 3724 KiB
22.txt AC 36 ms 3644 KiB
23.txt AC 51 ms 3816 KiB
24.txt AC 69 ms 3584 KiB
25.txt AC 14 ms 3772 KiB
26.txt AC 25 ms 3632 KiB
27.txt AC 116 ms 3764 KiB
28.txt AC 146 ms 3776 KiB
29.txt AC 436 ms 3608 KiB
30.txt AC 392 ms 3708 KiB
31.txt AC 896 ms 3712 KiB
32.txt AC 1488 ms 3728 KiB
33.txt AC 1696 ms 3760 KiB
34.txt AC 2176 ms 3732 KiB
35.txt AC 2306 ms 3600 KiB
36.txt AC 2581 ms 3828 KiB
37.txt AC 2580 ms 3800 KiB
38.txt AC 2726 ms 3728 KiB