CF997C Sky Full of Stars
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)\) 的每个方案,都被重复计数了 \(\binom{i}{x}\binom{j}{y}\) 次。
\[F(x,y)=\sum_{i=x}^n\sum_{j=y}^n \binom{i}{x}\binom{j}{y}G(i,j)
\]
那么根据二项式反演,有
\[G(x,y)=\sum_{i=x}^n\sum_{j=y}^n (-1)^{i-x+j-y} \binom{i}{x}\binom{j}{y} F(i,j)
\]
代入 \(x=0,y=0\) ,答案就是
\[3^{n^2}-\sum_{i=0}^n\sum_{j=0}^n (-1)^{i+j}F(i,j)
\]
那么只需要将 \(F\) 求出即可,根据 \(F\) 的定义容易知道
\[F(i,j)=\begin{cases}
\binom{n}{i}\binom{n}{j}\times 3\times 3^{(n-i)(n-j)} , & ij\neq 0\\
\binom{n}{i}\times 3^i \times 3^{n(n-i)}, & ij=0 \ \mbox{and}\ i\neq 0\\
\binom{n}{j}\times 3^j \times 3^{n(n-j)}, & ij=0 \ \mbox{and}\ j\neq 0\\
3^{n^2} , & i+j=0
\end{cases}\]
分情况求出 \(G(0,0)\),即按 \(F\) 的取值分类,易得
\[G(0,0)=\sum_{i=1}^n\sum_{j=1}^n (-1)^{i+j}F(i,j)+2\sum_{i=1}^n (-1)^i F(i,0)+F(0,0)
\]
第一项
\[\sum_{i=1}^n\sum_{j=1}^n (-1)^{i+j} \binom{n}{i}\binom{n}{j} \times 3 \times 3^{(n-i)(n-j)}=3\sum_{i=1}^n (-1)^i\binom{n}{i}\sum_{j=1}^n \binom{n}{j}(-1)^j\times (3^{n-i})^{n-j}=(*)
\]
对后面的式子用二项式定理,注意下指标从 \(1\)开始,故还要减去第 \(0\) 项的值 \((3^{n-i})^n\),得
\[(*)=3\sum_{i=1}^n (-1)^i \binom{n}{i}[(3^{n-i}-1)^n-3^{n(n-i)}]
\]
可以 \(O(n\log n)\) 直接求了。对于第二项只有单重求和,不用化简,\(O(n\log 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);
}

浙公网安备 33010602011771号