首先进行容斥,用行中存在同色加列中存在同色减去行列均有同色的方案数
则为:
\[\begin{aligned}\left(2\sum_{i=1}^n(-1)^{i-1}3^{i+n(n-i)}{n\choose i}\right)+\left(\sum_{i=1}^n\sum_{j=1}^n(-1)^{i+j}3^{(n-i)(n-j)+1}{n\choose i}{n\choose j} \right)\end{aligned} \]前面的直接枚举计算,考虑化简后面的
\[\begin{aligned}&\sum_{i=1}^n\sum_{j=1}^n(-1)^{i+j}3^{(n-i)(n-j)+1}{n\choose i}{n\choose j}\\=&3\sum_{i=0}^{n-1}(-1)^i{n\choose i}\sum_{j=0}^{n-1}(-1)^j3^{ij}{n\choose j}\\=&3\sum_{i=0}^{n-1}(-1)^i{n\choose i}\left((1-3^i)^j-(-1)^n3^{ni}\right)\end{aligned} \]直接计算即可
时间复杂度\(O(n)/O(n\log n)\)
#include<bits/stdc++.h> using namespace std; # define ll long long # define read read1<ll>() # define Type template<typename T> Type T read1(){ T t=0; char k; bool vis=0; do (k=getchar())=='-'&&(vis=1);while('0'>k||k>'9'); while('0'<=k&&k<='9')t=(t<<3)+(t<<1)+(k^'0'),k=getchar(); return vis?-t:t; } # define fre(k) freopen(k".in","r",stdin);freopen(k".out","w",stdout) # define ll long long # define mod 998244353 ll ans,n,fac[1000005],inv[1000005]; void init(const int N=1000000){ fac[0]=fac[1]=inv[0]=inv[1]=1; for(int i=2;i<=N;++i)fac[i]=fac[i-1]*i%mod,inv[i]=(mod-mod/i)*inv[mod%i]%mod; for(int i=2;i<=N;++i)inv[i]=inv[i-1]*inv[i]%mod; } ll C(int x,int y){return x<y||y<0?0:fac[x]*inv[y]%mod*inv[x-y]%mod;} ll P3(ll x){ if(!x)return 1; ll v=P3(x>>1); v=v*v%mod; if(x&1)v=v*3%mod; return v; } ll qkpow(ll n,ll m){ ll t=1; for(;m;m>>=1,n=n*n%mod) if(m&1)t=t*n%mod; return t; } int main(){init(); n=read; for(int i=1;i<=n;++i) if(i&1)ans=(ans+C(n,i)*P3(i)%mod*P3((n-i)*n))%mod; else ans=(ans-C(n,i)*P3(i)%mod*P3((n-i)*n))%mod; ans=ans*2%mod; ll t=0; for(int i=0;i<n;++i) t=(t+(i&1?1:-1)*C(n,i)*(qkpow(1-P3(i),n)-qkpow(-P3(i),n)))%mod; cout<<((ans+t*3)%mod+mod)%mod; return 0; }