QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#344280 | #7648. 网格图最大流计数 | Crysfly | 0 | 38ms | 9112kb | C++17 | 5.6kb | 2024-03-03 22:27:26 | 2024-03-03 22:27:27 |
Judging History
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%