Link
Solution
令 (G(x,y)) 表示恰好有 (x) 行 (y) 列的颜色相等的方案数,那么答案就可以表示为 (3^{n^2}-G(0,0))
令 (F(x,y)) 表示选 (x) 行 (y) 列为同种颜色,剩下的可以随便选的可重方案数。
尝试用 (G) 表示 (F),容易知道在 (F(x,y)) 中,(G(i,j)) 的每个方案,都被重复计数了 (inom{i}{x}inom{j}{y}) 次。
[F(x,y)=sum_{i=x}^nsum_{j=y}^n inom{i}{x}inom{j}{y}G(i,j)
]
那么根据二项式反演,有
[G(x,y)=sum_{i=x}^nsum_{j=y}^n (-1)^{i-x+j-y} inom{i}{x}inom{j}{y} F(i,j)
]
代入 (x=0,y=0) ,答案就是
[3^{n^2}-sum_{i=0}^nsum_{j=0}^n (-1)^{i+j}F(i,j)
]
那么只需要将 (F) 求出即可,根据 (F) 的定义容易知道
[F(i,j)=egin{cases}
inom{n}{i}inom{n}{j} imes 3 imes 3^{(n-i)(n-j)} , & ij
eq 0\
inom{n}{i} imes 3^i imes 3^{n(n-i)}, & ij=0 mbox{and} i
eq 0\
inom{n}{j} imes 3^j imes 3^{n(n-j)}, & ij=0 mbox{and} j
eq 0\
3^{n^2} , & i+j=0
end{cases}]
分情况求出 (G(0,0)),即按 (F) 的取值分类,易得
[G(0,0)=sum_{i=1}^nsum_{j=1}^n (-1)^{i+j}F(i,j)+2sum_{i=1}^n (-1)^i F(i,0)+F(0,0)
]
第一项
[sum_{i=1}^nsum_{j=1}^n (-1)^{i+j} inom{n}{i}inom{n}{j} imes 3 imes 3^{(n-i)(n-j)}=3sum_{i=1}^n (-1)^iinom{n}{i}sum_{j=1}^n inom{n}{j}(-1)^j imes (3^{n-i})^{n-j}=(*)
]
对后面的式子用二项式定理,注意下指标从 (1)开始,故还要减去第 (0) 项的值 ((3^{n-i})^n),得
[(*)=3sum_{i=1}^n (-1)^i inom{n}{i}[(3^{n-i}-1)^n-3^{n(n-i)}]
]
可以 (O(nlog n)) 直接求了。对于第二项只有单重求和,不用化简,(O(nlog n)) 直接求。
#include<stdio.h>
#define N 1000007
#define ll long long
#define Mod 998244353
ll fac[N],inv[N];
ll qpow(ll x,ll y){
x=(x%Mod+Mod)%Mod;
ll ret=1,cnt=0;
while(y>=(1LL<<cnt)){
if(y&(1LL<<cnt)) ret=(ret*x)%Mod;
x=(x*x)%Mod,cnt++;
}
return ret;
}
ll C(ll x,ll y){
if(x<y) return 0;
return fac[x]*inv[y]%Mod*inv[x-y]%Mod;
}
ll n;
int main(){
fac[0]=1;
for(int i=1;i<N;i++) fac[i]=fac[i-1]*i%Mod;
inv[N-1]=qpow(fac[N-1],Mod-2);
for(int i=N-2;~i;i--) inv[i]=inv[i+1]*(i+1)%Mod;
ll ans=0; scanf("%lld",&n);
for(int i=1,op=-1;i<=n;i++,op=-op)
ans=(ans+3*op*C(n,i)*((qpow(qpow(3LL,n-i)-1,n)-qpow(3LL,n*(n-i)%(Mod-1))+Mod)%Mod)%Mod)%Mod;
for(int i=1,op=-1;i<=n;i++,op=-op)
ans=(ans+2*op*C(n,i)*qpow(3LL,i)%Mod*qpow(3LL,n*(n-i)%(Mod-1))%Mod+Mod)%Mod;
printf("%lld",ans);
}