QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#344280#7648. 网格图最大流计数Crysfly0 38ms9112kbC++175.6kb2024-03-03 22:27:262024-03-03 22:27:27

Judging History

你现在查看的是最新测评结果

  • [2024-03-03 22:27:27]
  • 评测
  • 测评结果:0
  • 用时:38ms
  • 内存:9112kb
  • [2024-03-03 22:27:26]
  • 提交

answer

// what is matter? never mind. 
//#pragma GCC optimize("Ofast")
//#pragma GCC optimize("unroll-loops")
//#pragma GCC target("sse,sse2,sse3,sse4,popcnt,abm,mmx,avx,avx2") 
#include<bits/stdc++.h>
#define For(i,a,b) for(int i=(a);i<=(b);++i)
#define Rep(i,a,b) for(int i=(a);i>=(b);--i)
#define ll long long
#define int long long
#define ull unsigned long long
#define SZ(x) ((int)((x).size()))
#define ALL(x) (x).begin(),(x).end()
using namespace std;
inline int read()
{
    char c=getchar();int x=0;bool f=0;
    for(;!isdigit(c);c=getchar())f^=!(c^45);
    for(;isdigit(c);c=getchar())x=(x<<1)+(x<<3)+(c^48);
    if(f)x=-x;return x;
}

#define mod 998244353
struct modint{
	int x;
	modint(int o=0){x=o;}
	modint &operator = (int o){return x=o,*this;}
	modint &operator +=(modint o){return x=x+o.x>=mod?x+o.x-mod:x+o.x,*this;}
	modint &operator -=(modint o){return x=x-o.x<0?x-o.x+mod:x-o.x,*this;}
	modint &operator *=(modint o){return x=1ll*x*o.x%mod,*this;}
	modint &operator ^=(int b){
		modint a=*this,c=1;
		for(;b;b>>=1,a*=a)if(b&1)c*=a;
		return x=c.x,*this;
	}
	modint &operator /=(modint o){return *this *=o^=mod-2;}
	friend modint operator +(modint a,modint b){return a+=b;}
	friend modint operator -(modint a,modint b){return a-=b;}
	friend modint operator *(modint a,modint b){return a*=b;}
	friend modint operator /(modint a,modint b){return a/=b;}
	friend modint operator ^(modint a,int b){return a^=b;}
	friend bool operator ==(modint a,int b){return a.x==b;}
	friend bool operator !=(modint a,int b){return a.x!=b;}
	bool operator ! () {return !x;}
	modint operator - () {return x?mod-x:0;}
	bool operator <(const modint&b)const{return x<b.x;}
};
inline modint qpow(modint x,int y){return x^y;}

vector<modint> fac,ifac,iv;
inline void initC(int n)
{
	if(iv.empty())fac=ifac=iv=vector<modint>(2,1);
	int m=iv.size(); ++n;
	if(m>=n)return;
	iv.resize(n),fac.resize(n),ifac.resize(n);
	For(i,m,n-1){
		iv[i]=iv[mod%i]*(mod-mod/i);
		fac[i]=fac[i-1]*i,ifac[i]=ifac[i-1]*iv[i];
	}
}
inline modint C(int n,int m){
	if(m<0||n<m)return 0;
	return initC(n),fac[n]*ifac[m]*ifac[n-m];
}
inline modint sign(int n){return (n&1)?(mod-1):(1);}

#define fi first
#define se second
#define pb push_back
#define mkp make_pair
typedef pair<int,int>pii;
typedef vector<int>vi;
 
#define maxn 1005
#define inf 0x3f3f3f3f

#define poly vector<modint>

template<class T>
poly Char(int n,T a){
	static modint f[1005][1005];
	For(i,1,n-1){
		int p=-1;
		For(j,i+1,n)
			if(a[j][i].x){p=j;break;}
		if(p==-1)continue;
		else if(p!=i+1){
			For(j,1,n)swap(a[p][j],a[i+1][j]);
			For(j,1,n)swap(a[j][p],a[j][i+1]);
		}
		For(j,i+2,n){
			modint tmp=a[j][i]/a[i+1][i];
			For(k,1,n)a[j][k]-=tmp*a[i+1][k];
			For(k,1,n)a[k][i+1]+=tmp*a[k][j];
		}
	}
	f[0][0]=1;
	For(i,1,n){
		For(j,0,n)f[i][j]=0;
		For(j,1,i-1){
			modint tmp=a[j][i];
			For(k,j,i-1)tmp*=a[k+1][k];
			For(k,0,i)f[i][k]-=tmp*f[j-1][k];
		}
		For(j,1,n)f[i][j]+=f[i-1][j-1];
		For(j,0,n)f[i][j]-=a[i][i]*f[i-1][j];
	}
	return poly(f[n],f[n]+n+1);
}

template<class T>
modint det(int n,T a){
	modint res=1;
	For(j,1,n){
		For(i,j,n)
			if(a[i][j].x){
				if(i!=j){
					res=-res;
					For(k,i,n)swap(a[i][k],a[j][k]);
				}
				break;
			}
		if(!a[j][j].x)return 0;
		res*=a[j][j];
		modint iv=1/a[j][j];
		For(i,j+1,n){
			modint tmp=a[i][j]*iv;
			For(k,j,n)a[i][k]-=a[j][k]*tmp;
		}
	}
	return res;
}

template<class T>
modint pf(int n,T a){
	modint res=1;
	for(int i=1;i<=n;i+=2){
		if(!a[i][i+1].x){
			int k=i+1;
			while(k<=n && !a[i][k].x)++k;
			if(k>n)return 0;
			swap(a[i][i+1],a[i][k]);
			For(j,k+1,n)swap(a[i+1][j],a[k][j]);
			For(j,i+2,k-1)swap(a[i+1][j],a[j][k]),a[j][k]=-a[j][k],a[i+1][j]=-a[i+1][j];
			a[i+1][k]=-a[i+1][k];
			res=-res;
		}
		res*=a[i][i+1];
		modint I=1/a[i][i+1];
		For(j,i+2,n){
			modint r=a[i][j]*I;
			For(k,j+1,n)a[j][k]-=r*a[i+1][k];
			For(k,i+2,j-1)a[k][j]+=r*a[i+1][k];
		}
	}
	return res;
}

template<class T>
poly detpoly(int n,int d,T a){
	static modint b[1005][1005];
	int out=0;
	modint coe=1;
	For(i,1,n){
		int p=n+1;
		For(re,0,d){
			For(j,1,i-1)if(a[d][j][i].x){
				modint t=-a[d][j][i];
				For(e,0,d) For(k,1,n) a[e][k][i]+=a[e][k][j]*t;
			}
			p=i;
			while(p<=n && !a[d][p][i])++p;
			if(p<=n || re==d)break;
			++out;
			Rep(e,d,1) For(j,1,n) a[e][j][i]=a[e-1][j][i];
			For(j,1,n) a[0][j][i]=0;
		}
		if(p>n)return poly(n*d+1,0);
		if(p>i){
			coe=-coe;
			For(e,0,d)For(j,1,n)swap(a[e][i][j],a[e][p][j]);
		}
		coe*=a[d][i][i];
		modint I=a[d][i][i];
		For(j,i+1,n){
			modint t=-a[d][j][i];
			if(t.x) For(e,0,d) For(k,1,n) a[e][j][k]+=t*a[e][i][k];
		}
	}
	For(i,1,n*(d-1))b[i][n+i]=1;
	For(e,0,d-1)For(i,1,n)For(j,1,n)
		b[n*(d-1)+i][n*e+j]=-a[e][i][j];
	poly fs=Char(n*d,b);
	poly f(n*d+1);
	For(i,0,n*d-out)f[i]=coe*fs[i+out];
	return f;
}

int n,m,k,a[maxn],b[maxn];
char s[405][405];
modint f[405][405],go[405][405],sum[405][405],mat[405][405];

signed main()
{
	n=read(),m=read(),k=read();
	For(i,1,n)a[i]=read();
	For(i,1,m)b[i]=read();
	For(i,1,k)scanf("%s",s[i]+1);
	int mxf=n;
	For(i,1,n){
		memset(f,0,sizeof f);
		f[1][a[i]]=1;
		For(x,1,k)For(y,1,k)
			if(s[x][y]=='1')f[x+1][y]+=f[x][y],f[x][y+1]+=f[x][y];
			else f[x][y]=0;
		For(j,1,m) go[i][j]=f[k][b[j]];
	}
	if(n%2) ++n,++m,go[n][m]=1;
	For(i,1,n)For(j,1,m)sum[i][j]=sum[i][j-1]+go[i][j];
	For(i,1,n)For(j,i+1,n){
		For(k,1,m){
			modint t=sum[i][k]*go[j][k]-sum[j][k]*go[i][k];
			mat[i][j]+=t;
			mat[j][i]-=t;
		}
	}
	For(i,1,n)For(j,1,n)cout<<mat[i][j].x<<" \n"[j==n];
	modint res=pf(n,mat);
	cout<<mxf<<" "<<res.x;
	return 0;
}
/*

*/

Details

Tip: Click on the bar to expand more detailed information

Subtask #1:

score: 0
Wrong Answer

Test #1:

score: 0
Wrong Answer
time: 0ms
memory: 8748kb

input:

7 7 7
1 2 3 4 5 6 7
1 2 3 4 5 6 7
1111111
1111111
1111111
1111111
1111111
1111111
1111111

output:

0 77729 68384 39474 16752 4950 792 1716
998166624 0 16745 12944 6210 1968 330 792
998175969 998227608 0 2885 1856 666 120 330
998204879 998231409 998241468 0 365 176 36 120
998227601 998238143 998242497 998243988 0 29 8 36
998239403 998242385 998243687 998244177 998244324 0 1 8
998243561 998244023 9...

result:

wrong answer 1st numbers differ - expected: '7', found: '0'

Subtask #2:

score: 0
Skipped

Dependency #1:

0%

Subtask #3:

score: 0
Skipped

Dependency #2:

0%

Subtask #4:

score: 0
Skipped

Dependency #3:

0%

Subtask #5:

score: 0
Wrong Answer

Test #31:

score: 0
Wrong Answer
time: 38ms
memory: 9112kb

input:

73 73 400
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 ...

output:

0 17378632 609017178 934739824 565906327 525850579 690909213 218492246 872513911 125902369 404579636 886306509 597500296 861920281 774743858 510467370 199245192 222047277 838246974 529509106 317912854 562393930 837061993 824935482 480637553 428448938 877638482 24629224 77955738 869408503 475069452 2...

result:

wrong answer 1st numbers differ - expected: '73', found: '0'

Subtask #6:

score: 0
Skipped

Dependency #5:

0%

Subtask #7:

score: 0
Skipped

Dependency #1:

0%