题意

题目链接

\(n \times n\)的网格,用三种颜色染色,问最后有一行/一列全都为同一种颜色的方案数

Sol

Orz fjzzq

最后答案是这个

\[3^{n^2} - (3^n - 3)^n - \sum_{i = 1}^n (-1)^i C_n^i 3(3^{n-i} - 1)^n + (3^i - 3)(3^{(n-i)n}) \]

我来强行解释一波。

首先可以做个转化:答案 = 总的方案 - 任意行/列都至少含有两种颜色的方案

我们先来考虑列,任意一列含有两种颜色的方案是\((3^n-3)^n\)(-3是因为颜色相同的三种方案)。但是这样我们会多减去行合法的情况,因此还需要加一些方案,这些方案满足存在至少一行颜色都相同且任意一列至少含有两种颜色。

发现"至少"不太好搞,我们可以通过容斥把它变成"恰好",也就是加上恰好一行满足的,减去恰好两行满足的...。

那么对于这恰好\(i\)行满足条件的我们又需要来分类讨论。首先把他们选出来方案数是\(C_n^i\)

接下来就要分两种情况

  1. 选出来的\(i\)行的颜色(每行都是相同的h)有任意两个不同

这时候就简单了,方案数为\((3^i - 3) (3^{(n-i)n})\)。也就是减去每行颜色都相同的三种方案,剩下的随便选

  1. 选出来的\(i\)行的颜色两两相同

这时候对于每一列都有\((3^{n-i}-1)\)种方案,共有\(n\)列。同时这\(i\)行的颜色又有三种选发。

因此这时候的方案数为\(3(3^{n-i}-1)^n\)

然后大力算就行了

复杂度\(O(n \log n)\)

#include<bits/stdc++.h>
#define Pair pair<int, int>
#define MP(x, y) make_pair(x, y)
#define fi first
#define se second
#define int long long
#define LL long long
#define Fin(x) {freopen(#x".in","r",stdin);}
#define Fout(x) {freopen(#x".out","w",stdout);}
using namespace std;
const int MAXN = 1e6 + 10, mod = 998244353, INF = 1e9 + 10;
const double eps = 1e-9;
template <typename A, typename B> inline bool chmin(A &a, B b){if(a > b) {a = b; return 1;} return 0;}
template <typename A, typename B> inline bool chmax(A &a, B b){if(a < b) {a = b; return 1;} return 0;}
template <typename A, typename B> inline LL add(A x, B y) {if(x + y < 0) return x + y + mod; return x + y >= mod ? x + y - mod : x + y;}
template <typename A, typename B> inline void add2(A &x, B y) {if(x + y < 0) x = x + y + mod; else x = (x + y >= mod ? x + y - mod : x + y);}
template <typename A, typename B> inline LL mul(A x, B y) {return 1ll * x * y % mod;}
template <typename A, typename B> inline void mul2(A &x, B y) {x = (1ll * x * y % mod + mod) % mod;}
template <typename A> inline void debug(A a){cout << a << '\n';}
template <typename A> inline LL sqr(A x){return 1ll * x * x;}
inline int read() {char c = getchar(); int x = 0, f = 1;while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();return x * f;
}
int N, fac[MAXN], ifac[MAXN];
int fp(int a, int p) {int base = 1;while(p) {if(p & 1) base = mul(base, a);p >>= 1; a = mul(a, a);}return base;
}
int C(int N, int M) {return mul(fac[N], mul(ifac[M], ifac[N - M]));
}
signed main() {cin >> N;fac[0] = 1; for(int i = 1; i <= N; i++) fac[i] = mul(i, fac[i - 1]);ifac[N] = fp(fac[N], mod - 2);for(int i = N; i >= 1; i--) ifac[i - 1] = mul(ifac[i], i);int ans = add(fp(3, N * N), -fp(fp(3, N) - 3, N));for(int i = 1; i <= N; i++) {if(i & 1) {add2(ans, mul(C(N, i), add(mul(3, fp(fp(3, N - i) - 1, N)), mul(fp(3, i) - 3, fp(3, (N - i) * N)))));} else {add2(ans, -mul(C(N, i), add(mul(3, fp(fp(3, N - i) - 1, N)), mul(fp(3, i) - 3, fp(3, (N - i) * N)))));}}cout << ans;return 0;
}

转载于:https://www.cnblogs.com/zwfymqz/p/10469178.html

cf997C. Sky Full of Stars(组合数 容斥)相关推荐

  1. CF997C Sky Full of Stars

    CF997C , Luogu 有一个 \(n \times n ( n \leq 10^6)\)的正方形网格,用红色,绿色,蓝色三种颜色染色,求有多少种染色方案使得至少一行或一列是同一种颜色.结果对 ...

  2. CodeForces 997C-Sky Full of Stars〖容斥定理+组合计数〗

    网页链接:传送门 C. Sky Full of Stars time limit per test : 4 seconds memory limit per test : 256 megabytes ...

  3. Codeforces 100548F - Color (组合数+容斥)

    题目链接:http://codeforces.com/gym/100548/attachments 有n个物品 m种颜色,要求你只用k种颜色,且相邻物品的颜色不能相同,问你有多少种方案. 从m种颜色选 ...

  4. CF997C Sky Full of Stars 数论

    正解:容斥 解题报告: 传送门! 两个方法,分别港下QAQ 先说第一种 首先要推出式子,就∑2*C(i,n)*(-1)i+1*3i*3n*n-n+3*∑∑(-1)i+j+1*C(i,n)*C(j,n) ...

  5. [CQOI2014]数三角形 组合数 + 容斥 + gcd

    推导过程 : 组合数+容斥原理+gcd 正确做法是暴力的一种优化,ans=所有情况 - 平行坐标轴的三点共线 - 斜线三点共线 如果快速求斜线三点共线: 首先要知道一个结论,对于点(a,b) (x,y ...

  6. [bzoj2839]集合计数 题解 (组合数+容斥)

    Description 一个有N个元素的集合有2^N个不同子集(包含空集),现在要在这2^N个集合中取出若干集合(至少一个),使得 它们的交集的元素个数为K,求取法的方案数,答案模1000000007 ...

  7. [XSY] 简单的博弈题(博弈+dp+组合数+容斥)

    简单的博弈题 对于贪心的对手,显然用最大的一半和他最小的一半比较判断是否全胜.(这不就是田忌赛马吗) 对于随机的对手,先考虑暴力怎么做: void check(int x,int w){if(x> ...

  8. 数论五之容斥——硬币购物,Gerald and Giant Chess,幸运数字,Sky Full of Stars,已经没有什么好害怕的了

    容斥的神 [HAOI2008]硬币购物 problem solution code CF559C Gerald and Giant Chess problem solution code [SCOI2 ...

  9. F-子序列(组合数,打表,扩展欧拉,容斥)

    题目链接 题目描述 给出一个长度为n的序列,你需要计算出所有长度为k的子序列中,除最大最小数之外所有数的乘积相乘的结果 输入描述: 第一行一个整数T,表示数据组数. 对于每组数据,第一行两个整数N,k ...

最新文章

  1. python多线程下载百度网盘_python多线程突破百度云限速下载
  2. 算法65----字符串
  3. python调用mysql中的自定义function并且返回结果
  4. 函数调用 压栈的工作原理
  5. io.realm:rea_使Java具有响应性的框架和工具包:RxJava,Spring Reactor,Akka和Vert.x概述...
  6. REST /使用提要发布事件
  7. laravel 集成采集_新版2020 Laravel采集网站程序
  8. 配置CentOS6.3 NFS
  9. js Indexof的用法
  10. 怎么启动计算机后台打印服务,Win10系统中打印机后台服务没有启动解决方法
  11. 什么是知识,什么是知识图谱,有什么作用,有哪些应用领域?
  12. 做淘宝页面前的基础准备
  13. sqlserver 数据库优化工具,安全性设置,并发设置,SQL耗时优化
  14. 平衡二叉查找树的构建
  15. windows server 2003 连接 win10 共享打印机
  16. 安装abuntu时候联想拯救者R7000P怎么进入bios
  17. SAP程序设计/黄佳:图书:价格比较:琅琅比价网
  18. 宠辱不惊,看庭前花开花落;去留无意,望天空云卷云舒
  19. 六顶帽子思考法的要求与好处
  20. 广东省工业互联网产业联盟发布广东省工业互联网产业生态供给资源池报道

热门文章

  1. 虹科分享 | 终端安全防护 | 网络安全术语列表(终篇)
  2. 前端如何通过vue/cli脚手架创建vue项目
  3. 2021年网络规划设计师论文真题
  4. 全职高手主题曲计算机,全职高手电视剧所有歌曲介绍 主题曲片尾曲插曲
  5. SOHO回归职场,英文介绍怎么做?
  6. 国家初中学生体质测试评分软件,国家学生体质健康标准评分表__小学,初中,高中...
  7. 微信小程序——实现音乐播放器(上下切换歌曲、进度条拉动、暂停与继续播放)
  8. 述职答辩提问环节一般可以问些什么_述职答辩前
  9. C++使用fill初始化二维数组
  10. topic是短语还是句子_八年级上册英语Unit2  Topic1重点短语、句子、语法