题意

题目链接

\(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)\)

  1. #include<bits/stdc++.h>
  2. #define Pair pair<int, int>
  3. #define MP(x, y) make_pair(x, y)
  4. #define fi first
  5. #define se second
  6. #define int long long
  7. #define LL long long
  8. #define Fin(x) {freopen(#x".in","r",stdin);}
  9. #define Fout(x) {freopen(#x".out","w",stdout);}
  10. using namespace std;
  11. const int MAXN = 1e6 + 10, mod = 998244353, INF = 1e9 + 10;
  12. const double eps = 1e-9;
  13. template <typename A, typename B> inline bool chmin(A &a, B b){if(a > b) {a = b; return 1;} return 0;}
  14. template <typename A, typename B> inline bool chmax(A &a, B b){if(a < b) {a = b; return 1;} return 0;}
  15. 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;}
  16. 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);}
  17. template <typename A, typename B> inline LL mul(A x, B y) {return 1ll * x * y % mod;}
  18. template <typename A, typename B> inline void mul2(A &x, B y) {x = (1ll * x * y % mod + mod) % mod;}
  19. template <typename A> inline void debug(A a){cout << a << '\n';}
  20. template <typename A> inline LL sqr(A x){return 1ll * x * x;}
  21. inline int read() {
  22. char c = getchar(); int x = 0, f = 1;
  23. while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}
  24. while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
  25. return x * f;
  26. }
  27. int N, fac[MAXN], ifac[MAXN];
  28. int fp(int a, int p) {
  29. int base = 1;
  30. while(p) {
  31. if(p & 1) base = mul(base, a);
  32. p >>= 1; a = mul(a, a);
  33. }
  34. return base;
  35. }
  36. int C(int N, int M) {
  37. return mul(fac[N], mul(ifac[M], ifac[N - M]));
  38. }
  39. signed main() {
  40. cin >> N;
  41. fac[0] = 1; for(int i = 1; i <= N; i++) fac[i] = mul(i, fac[i - 1]);
  42. ifac[N] = fp(fac[N], mod - 2);
  43. for(int i = N; i >= 1; i--) ifac[i - 1] = mul(ifac[i], i);
  44. int ans = add(fp(3, N * N), -fp(fp(3, N) - 3, N));
  45. for(int i = 1; i <= N; i++) {
  46. if(i & 1) {
  47. 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)))));
  48. } else {
  49. 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)))));
  50. }
  51. }
  52. cout << ans;
  53. return 0;
  54. }

cf997C. Sky Full of Stars(组合数 容斥)的更多相关文章

  1. CF997C Sky Full of Stars

    CF997C Sky Full of Stars 计数好题 在Ta的博客查看 容斥式子:发现只要每个钦定方案的贡献都考虑到再配上容斥系数就是对的 O(n^2)->O(n) 把麻烦的i=0,j=0 ...

  2. 【题解】CF997C Sky Full of Stars

    [题解]CF997C Sky Full of Stars 为什么我的容斥原理入门题是这道题????????? \(Part-1\)正向考虑 直接考虑不合法合法的方案吧 所以我们设行有\(i\),列有\ ...

  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. BZOJ5306 [HAOI2018]染色 【组合数 + 容斥 + NTT】

    题目 为了报答小 C 的苹果, 小 G 打算送给热爱美术的小 C 一块画布, 这块画布可 以抽象为一个长度为 \(N\) 的序列, 每个位置都可以被染成 \(M\) 种颜色中的某一种. 然而小 C 只 ...

  6. 【BZOJ4710】[Jsoi2011]分特产 组合数+容斥

    [BZOJ4710][Jsoi2011]分特产 Description JYY 带队参加了若干场ACM/ICPC 比赛,带回了许多土特产,要分给实验室的同学们. JYY 想知道,把这些特产分给N 个同 ...

  7. HDU - 5201 :The Monkey King (组合数 & 容斥)

    As everyone known, The Monkey King is Son Goku. He and his offspring live in Mountain of Flowers and ...

  8. CodeForces - 285E: Positions in Permutations(DP+组合数+容斥)

    Permutation p is an ordered set of integers p1,  p2,  ...,  pn, consisting of n distinct positive in ...

  9. 【BZOJ2839】集合计数 组合数+容斥

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

随机推荐

  1. Eclipse 常用快捷键使用说明

    注释快捷键 Ctrl + / 选中代码后快速加//注释, 再次用取消//注释 Ctrl + Shift + / 选中代码后快速加/* */注释 Ctrl + Shift + \ 选中代码后快速取消/* ...

  2. 第三节:带你详解Java的操作符,控制流程以及数组

    前言 大家好,给大家带来带你详解Java的操作符,控制流程以及数组的概述,希望你们喜欢 操作符 算数操作符 一般的 +,-,*,/,还有两个自增 自减 ,以及一个取模 % 操作符. 这里的操作算法,一 ...

  3. NumPy 学习笔记(二)

    数组索引: 1.ndarray对象的内容可以通过索引或切片来访问和修改,与 Python 中 list 的切片操作一样:   由于数组可能是多维的,所以必须为数组的每个维度指定一个切片,使用切片时返回 ...

  4. es7你都懂了吗?今天带你了解es7的神器decorator

    es7带来了很多更强大的方法,比如async/await,decorator等,相信大家对于async/await已经用的很熟练了,下面我们来讲一下decorator. 何为decorator? 官方 ...

  5. nginx介绍(二) 架构篇

    2. nginx架构总览 传统的基于进程或者基于线程的模型处理并发的方式都是为每个连接单独创建一个处理进程或线程,会在网络传输或者I/O操作上阻塞.而这对应用来说,在内存和 CPU的使用上效率都是非常 ...

  6. C++11实现一个轻量级的AOP框架

    AOP介绍 AOP(Aspect-Oriented Programming,面向方面编程),可以解决面向对象编程中的一些问题,是OOP的一种有益补充.面向对象编程中的继承是一种从上而下的关系,不适合定 ...

  7. 转:centos7搭建jenkins小记

    转自:https://segmentfault.com/a/1190000007086764 安装java环境 1.查看服务器版本 centos7,继续. cat /etc/redhat-releas ...

  8. 安装mono和monoDevelop开发环境

    我之前用的是Ubuntu10.12版本的linux,一直被软件更新包困扰,总是保存缺少依赖包的问题!总之在网络上找到的软件更新包地址都不能解决问题.后来就用了比较新的TLS版本Ubuntu14.04. ...

  9. 小程序开发--template模板

    小程序的template模板可以说是我遇到的最简单的了,看看实例: <template name="article"> <view class='containe ...

  10. html自适应头

     <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-sca ...