zoukankan      html  css  js  c++  java
  • CF997C Sky Full of Stars

    传送门

    luogu

    本题要求至少一行或一列为同一种颜色,可以转化为总方案数减去所有行和所有列不为同一种颜色

    后面那个东西可以用容斥去做,枚举几行几列是同色的,然后剩下的格子随便取,方案为$$sum_{i=0}{n}sum_{j=0}{n}(-1)^{i+j}inom{n}{i}inom{n}{j}egin{cases} 3{i+j}3{(n-i)(n-j)}&i=0 mathrm{or} j=0 33^{(n-i)(n-j)}&otherwiseend{cases}$$

    不要吐槽上面那坨式子qwqqwq

    然后就可以(O(n^2))了,但是无法通过此题.主要耗时是后面那个式子,把后面和j无关的东西丢到前面去,得$$3sum_{i=1}{n}(-1){i}inom{n}{i}sum_{j=1}{n}(-1){j}inom{n}{j}3^{(n-i)(n-j)}$$

    注意到(3^{(n-i)(n-j)}=(3^{n-i})^{n-j}),可以联想到二项式定理((x+y)^n=sum_{i=0}^{n}inom{n}{i}x^iy^{n-i}),然后能得到$$3sum_{i=1}{n}(-1){i}inom{n}{i}((3{n-i}-1)n-3^{n-i})$$

    (注意j从1开始)

    没了

    #include<bits/stdc++.h>
    #define LL long long
    #define il inline
    
    using namespace std;
    const int M=1e7+10,mod=998244353;
    il LL rd()
    {
        LL x=0,w=1;char ch=0;
        while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar();}
        while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
        return x*w;
    }
    int n;
    int fpow(int a,int b){int an=1;while(b){if(b&1) an=1ll*an*a%mod;a=1ll*a*a%mod,b>>=1;} return an;}
    namespace ct3
    {
        int fac[M],iac[M];
        int C(int n,int m){return m<0||n<m?0:1ll*fac[n]*iac[m]%mod*iac[n-m]%mod;}
        int ans;
        void wk()
        {
            fac[0]=1;
            for(int i=1;i<=n;++i) fac[i]=1ll*fac[i-1]*i%mod;
            iac[n]=fpow(fac[n],mod-2);
            for(int i=n;i;--i) iac[i-1]=1ll*iac[i]*i%mod;
            for(int i=1;i<=n;++i)
            {
                int x=(1ll*C(n,i)*(fpow(fpow(3,n-i)-1,n)-fpow(fpow(3,n-i),n))%mod+mod)%mod;
                ans=(ans+((i&1)?mod-x:x))%mod;
            }
            ans=1ll*ans*3%mod;
            for(int i=0;i<=n;++i)
            {
                int x=1ll*C(n,i)*fpow(3,i)%mod*fpow(fpow(3,n-i),n)%mod;
                ans=(ans+((i&1)?mod-x:x))%mod;
            }
            for(int j=1;j<=n;++j)
            {
                int x=1ll*C(n,j)*fpow(3,j)%mod*fpow(fpow(3,n),n-j)%mod;
                ans=(ans+((j&1)?mod-x:x))%mod;
            }
            printf("%d
    ",(fpow(fpow(3,n),n)-ans+mod)%mod);
        }
    }
    
    int main()
    {
        n=rd();
        ct3::wk();  //qwq
        return 0;
    }
    
  • 相关阅读:
    count(1)、count(*)与count(列名)的执行区别
    解析Json字符串中的指定的值
    消息队列的好处与弊端
    17 ~ express ~ 分类的显示 ,修改 和 删除
    Express ~ 获取表单 get 和 post 提交方式传送参数的对比
    16 ~ express ~ 添加博客分类
    JS ~ Promise 对象
    JS ~ Promise.reject()
    JS ~ 返回上一步
    PHP ~ 通过程序删除图片,同时删除数据库中的图片数据 和 图片文件
  • 原文地址:https://www.cnblogs.com/smyjr/p/10512111.html
Copyright © 2011-2022 走看看