• CF997C Sky Full of Stars


    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);
    }
    
  • 相关阅读:
    Maven编译插件
    Error querying database. Cause: com.baomidou.mybatisplus.core.exceptions.MybatisPlusException: Fail
    mysql 行锁操作值
    谷歌同步书签
    sum 结果作为条件
    date_sub,date_add的用法
    Ensure private network requests are made from secure contexts
    民间曲艺莲花落 All In One
    Linux shell man command All In One
    Chrome 浏览器运行机制原理解析 All In One
  • 原文地址:https://www.cnblogs.com/wwlwQWQ/p/14254190.html
Copyright © 2020-2023  润新知