CodeForces - 997C Sky Full of Stars

题目链接

CodeForces - 997C Sky Full of Stars

题解

有空补一下套题题解Qwq,然而我只是pilpuQwq
\(f(i,j)\)表示至少有i行j列一种颜色的方案数
可以发现,当ij有相交时颜色只能为一种
那么对于\(i=0 || j=0\)\(f(i,j) = C_n^i * C_n^j*3^{(n - i) *(n - j) + i + j}\)
否则\(f(i,j) = C_n^i * C_n^j*3^{(n - i) * (n - j) + 1}\)
可以得到一种很显然的容斥方法
对于第一种情况单独算,复杂度\(nlogn\)
对于第二个式子,容斥是\(n^2\)的,推式子
\(3\sum_{i=1}^{n}\sum_{j=1}^{n}{C_n^iC_n^j(-1)^{i+j+1}3^{(n-i)(n-j)}}\)
\(T=3^{ij}\)换元\(3^{(n - i)*(n - j)}\)
原式\(=3\sum_{i = 0}^{n - 1}\sum_{j = 0}^{n - 1}C_n^iC_n^j(-1)^{i + j - 1}3^{ij}\)
\((-1)^{i + j + 1}\)
\(=3\sum_{i = 0}^{n - 1}C_n^i(-1)^{i + 1}\sum_{j = 0}^{n - 1}C_n^j(-3^i)^{j}\)
\(T=(-3)^i\)
对于后面那部分二项式定理因式分解
\(=3\sum_{i = 0}^{n - 1} C_n^i (-1)^{i + 1} *[(1 + T)^n - T^n]\)
复杂变成了\(nlogn\)

代码

#include<bits/stdc++.h> 
using namespace std;  
#define int long long 
const int maxn = 1000007; 
const int mod = 998244353; 
int n,fac[maxn],inv[maxn]; 
int fstpow(int x,int y) { 
    x %= mod; 
    int ret = 1; 
    for(; y; y >>= 1,x = 1ll * x * x % mod) 
        if(y & 1)  ret = 1ll * ret * x % mod; 
    return ret; 
}  
int calc(int x,int y) { 
    return 1ll * ((fac[x] * inv[y]) % mod) * (inv[x - y]) % mod; 
} 
void get_inv() { 
    fac[0] = 1,inv[0] = 1; 
    for(int i = 1;i <= n;i++) { 
        fac[i] = 1ll * fac[i - 1] * i % mod;  
        inv[i] = fstpow(fac[i],mod - 2);  
    }    
}   
main() { 
    scanf("%I64d",&n);  
    get_inv();  
    int ans1 = 0;  
    for(int a,b,i = 1;i <= n;i++) { 
        a = 1ll * calc(n,i) * fstpow(-1,i + 1) % mod; 
        b = fstpow(3, (1ll * n * (n - i) + i) % (mod - 1)); 
        ans1 = (ans1 + (1ll * a * b % mod)) % mod; 
    } 
    ans1 = 2 * ans1 % mod; 
    int ans2 = 0; 
    for(int t,b,a,i = 0;i < n;i++) {     
        a = 1ll * calc(n,i) * fstpow(-1,i + 1) % mod; 
        t = mod - fstpow(3,i); 
        b = (fstpow(t + 1,n) + mod - fstpow(t,n)) % mod; 
        ans2 = (ans2 + (1ll * a * b) % mod) % mod;  
    } 
    //int tmp = 
    printf("%I64d\n",(((ans1 + 1ll * ans2 * 3) % mod) + mod) % mod); 
    return 0; 
} 

转载于:https://www.cnblogs.com/sssy/p/9282168.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值