【容斥计数】Codeforces 998E Sky Full of Stars
题面在这里
题意:用3种颜色涂满\(n\times n\)的矩阵,求至少一行或一列颜色相同的方案数
先考虑至少一列同色,方案为\(3^{n^2}-(3^n-3)^n\)
再加上至少一行同色,这里有些方案是重复的,这些方案只可能是所有同色行的颜色相同(如果不同就不会有同色列了)
用容斥处理,枚举有\(i\)个同色行,则:
- 所有同色行颜色相同:那么每一列都不能是这种颜色的同色列,\(3 {n\choose i}(3^{n-i}-1)^n\)
- 其他:不会有同色列产生,答案是\({n \choose i}(3^i-3)3^{n(n-i)}\)
示例程序:
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
| #include<cstdio> typedef long long ll;
const int maxn=1000005,MOD=998244353; int n; ll fac[maxn],inv[maxn]; inline ll ksm(ll a,ll b){ ll res=1,w=a; while (b){ if (b&1) (res*=w)%=MOD; (w*=w)%=MOD; b>>=1; } return res; } inline ll C(ll x,ll y){ return fac[x]*inv[y]%MOD*inv[x-y]%MOD; } int main(){ scanf("%d",&n); fac[0]=1;for (int i=1;i<=n;i++) fac[i]=(fac[i-1]*i)%MOD; inv[n]=ksm(fac[n],MOD-2);for (int i=n;i;i--) inv[i-1]=(inv[i]*i)%MOD; ll ans=(ksm(3,(ll)n*n)-ksm(ksm(3,n)-3,n))%MOD; for (int i=1;i<=n;i++){ ll del=3*C(n,i)%MOD*ksm(ksm(3,n-i)-1,n)%MOD+C(n,i)*(ksm(3,i)-3)%MOD*ksm(3,(ll)n*(n-i))%MOD;del%=MOD; if (i&1) (ans+=del)%=MOD;else (ans-=del)%=MOD; } printf("%lld",(ans+MOD)%MOD); return 0; }
|