【2021集训队出题】这是一道集训队胡策题

【2021集训队出题】这是一道集训队胡策题

by AmanoKumiko

Description

给出\(n*n\)\(01\)矩阵\(c\),求有多少长度为\(n\)的数组\(a,b\),满足\(c_{i,j}=a_i\)\(c_{i,j}=b_j\)

答案对\(998244353\)取模

Input

第一行一个整数\(n\)表示矩阵大小

然后读入\(n*n\)\(01\)矩阵

Output

一行一个整数表示答案

Sample Input

3
010
101
010

Sample Output

2

Data Constraint

\(1\le n\le 5*10^3,0\le c_{i,j}\le 1\)

Solution

我们设\(a\)中取了\(x\)\(1\),设\(b\)中有\(y\)\(1\)

然后设\(c_{i,j}=a_i\)的有\(sum1\)个,\(c_{i,j}=b_j\)的有\(sum2\)

我们考虑怎么计算合法位置和不合法位置的差

分析每一组\(i,j,a_i,b_j\),如果不匹配,那么贡献是\(-1\),否则为\(1\)

那么序列合法必须满足\(sum1+sum2-xy-(n-x)(n-y)=n^2\)

同时有\(sum1+sum2-xy-(n-x)(n-y)\le n^2\)

也就是说,必须贪心地放置\(1\)

那直接\(O(n^2)\)枚举个数,然后乘一些组合数即可

Code

#include<bits/stdc++.h>
using namespace std;
#define F(i,a,b) for(int i=a;i<=b;i++)
#define Fd(i,a,b) for(int i=a;i>=b;i--)
#define LL long long
#define mo 998244353
#define N 5010

char s[N];
int a[N][N],c1[N],c2[N],h1[N],top1,h2[N],top2,s1[N],s2[N],n,sum1[N],sum2[N],sr1[N],sr2[N];
LL ans,C[N][N],v1[N],v2[N];

bool cmp(int x,int y){return x>y;}

int main(){
	scanf("%d",&n);
	F(i,0,N-10)C[i][0]=1;
	F(i,1,N-10) F(j,1,i)C[i][j]=(C[i-1][j-1]+C[i-1][j])%mo;
	F(i,1,n){
		scanf("%s",s+1);
		F(j,1,n)a[i][j]=s[j]-'0';
	}
	F(i,1,n) F(j,1,n)c1[i]+=(a[i][j]==1),c2[i]+=(a[j][i]==1);
	memset(h1,-1,sizeof(h1));
	memset(h2,-1,sizeof(h2));
	sort(c1+1,c1+n+1,cmp);
	sort(c2+1,c2+n+1,cmp);
	F(i,1,n){
		if(c1[i]!=h1[top1])h1[++top1]=c1[i],s1[top1]=1;
		else s1[top1]++;
		if(c2[i]!=h2[top2])h2[++top2]=c2[i],s2[top2]=1;
		else s2[top2]++;
	}
	Fd(i,top1,1)sr1[i]=sr1[i+1]+(n-h1[i])*s1[i];
	Fd(i,top2,1)sr2[i]=sr2[i+1]+(n-h2[i])*s2[i];
	F(x,0,n){
		int rx=x;v1[x]=1;
		F(i,1,top1){
			if(rx>=s1[i])sum1[x]+=s1[i]*h1[i],rx-=s1[i];
			else{sum1[x]+=rx*h1[i]+(s1[i]-rx)*(n-h1[i])+sr1[i+1];v1[x]=C[s1[i]][rx];break;}
		}
	}
	F(y,0,n){
		int ry=y;v2[y]=1;
		F(i,1,top2){
			if(ry>=s2[i])sum2[y]+=s2[i]*h2[i],ry-=s2[i];
			else{sum2[y]+=ry*h2[i]+(s2[i]-ry)*(n-h2[i])+sr2[i+1];v2[y]=C[s2[i]][ry];break;}
		}
	}
	F(x,0,n) F(y,0,n)
		if(sum1[x]+sum2[y]-x*y-(n-x)*(n-y)==n*n)(ans+=v1[x]*v2[y]%mo)%=mo;
	printf("%lld",ans);
	return 0;
}
posted @ 2021-12-23 15:19  冰雾  阅读(183)  评论(0编辑  收藏  举报