CF997C , Luogu

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

有一个很显然的\(O(n^2)\)的容斥做法:枚举至少有多少行和多少列被染了色,那么显然答案为
\(ans=\sum_{i=0...n,j=0...n,i+j>0} C_n^iC_n^j(-1)^{i+j+1}3^{(n-i)(n-j)+1}\)
对原始进行化简 , 考虑只枚举一维 \(i\) , 剩下一维 \(j\) 转化为一个\(O(1)\)的式子.

接下来是实现细节.

不光是要发现\(i+j\not=0\) 这个条件非常讨嫌 , 而且\(i=0\)或\(j=0\)时各行或各列的颜色互不影响.这种情况要单独拎出来 .
\(ans1=2\sum_{i=0}^n(-1)^{i+1}C_n^i3^{n(n-i)+i}\)

当\(i \in[1,n],j \in[1,n]\)时 , 即行和列都有的时候 , 颜色必须都一样 .
\(ans2=\sum_{i=1}^n\sum_{j=1}^n(-1)^{i+j+1}C_n^iC_n^j3^{(n-i)(n-j)+1}\)

和组合数\(C\)有关的式子,首先想到

\((a+b)^n=\sum_{i=0}^nC_n^ia^ib^{n-i}\)

此时次幂要简洁 , 而\(C\)不需要 , 所以把 \(n-i\) 换成 \(i\) , 把 \(n-j\) 换成 \(j\) .
\(ans2=\sum_{i=0}^{n-1}\sum_{j=0}^{n-1}(-1)^{i+j+1}C_n^iC_n^j3^{ij+1}\)

把 \(i\) 提到前面 , 把 \(j\) 放到后面
\(ans2=3\sum_{i=0}^{n-1}(-1)^{i+1}C_n^i\sum_{j=0}^{n-1}(-1)^jC_n^j3^{ij}\)

考虑后面关于 \(j\) 的式子 \(\sum_{j=0}^{n-1}C_n^j(-3^i)^j(1)^{n-j} = (-3^i+1)^n - (-3^i)^n\)
\(ans2=3\sum_{i=0}^{n-1}(-1)^{i+1}(C_n^i(-3^i+1)^n - (-3^i)^n)\)

代码实现时注意一些细节.

\(1.\)可以把 \(-3^i\) 提出来 , 清晰很多 . 然后发现和负数有关的快速幂也只有 \(-1\) 的次方 , 负数也是可以直接快速幂的 .
\(2.\)复杂的式子一定要打空格!!!
\(3.\)qpow等函数全部开LL , 而且add也不要追求速度 , 老老实实写return (a+b)%mod; 而且复杂的式子里不要用这些 .
\(4.\) a-b 一定要写成(a-b+mod)%mod

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cassert>
#define debug(...) fprintf(stderr,__VA_ARGS__)
#define Debug(x) cout<<#x<<"="<<x<<endl
using namespace std;
typedef long long LL;
const int INF=1e9+7;
inline LL read(){register LL x=0,f=1;register char c=getchar();while(c<48||c>57){if(c=='-')f=-1;c=getchar();}while(c>=48&&c<=57)x=(x<<3)+(x<<1)+(c&15),c=getchar();return f*x;
}const int N=1e6+5;
const int mod=998244353;int fac[N],ifac[N];
int n;
LL ans1,ans2;inline LL add(LL x,LL y){return (x+y)%mod;}
inline LL mul(LL x,LL y){return 1ll*x*y%mod;}
inline LL qpow(LL a,LL b){LL res=1;for(;b;b>>=1,a=mul(a,a)) if(b&1) res=mul(res,a);return res;
}
inline int C(int n,int m){return mul(fac[n],mul(ifac[m],ifac[n-m]));
}int main(){n=read();fac[0]=fac[1]=ifac[0]=ifac[1]=1;for(int i=2;i<=n;i++) fac[i]=mul(fac[i-1],i);ifac[n]=qpow(fac[n],mod-2);for(int i=n-1;i>=2;i--) ifac[i]=mul(ifac[i+1],i+1);if(n>1) assert(mul(ifac[2],2)==1);assert(445648748569745648677454784e-330); // 324位for(int i=1;i<=n;i++){ans1 = (ans1 + (C(n,i) * qpow(3,1ll*n*(n-i)+i) % mod * qpow(-1,i+1)) + mod) % mod;}for(int i=0;i<=n-1;i++){int t = -qpow(3,i);ans2 = (ans2 + (C(n,i) * ((qpow(t+1,n) - qpow(t,n) + mod) % mod) % mod * qpow(-1,i+1)) + mod) % mod;}printf("%d\n",(ans1*2+ans2*3)%mod);
}

转载于:https://www.cnblogs.com/lizehon/p/11114439.html

CF997C Sky Full of Stars相关推荐

  1. 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) ...

  2. cf997C. Sky Full of Stars(组合数 容斥)

    题意 题目链接 \(n \times n\)的网格,用三种颜色染色,问最后有一行/一列全都为同一种颜色的方案数 Sol Orz fjzzq 最后答案是这个 \[3^{n^2} - (3^n - 3)^ ...

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

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

  4. Codeforces 997 C - Sky Full of Stars

    C - Sky Full of Stars 思路: 容斥原理 题解:http://codeforces.com/blog/entry/60357 注意当i > 1 且 j > 1,是同一种 ...

  5. [Codeforces 997C]Sky Full of Stars(排列组合+容斥原理)

    [Codeforces 997C]Sky Full of Stars(排列组合+容斥原理) 题面 用3种颜色对\(n×n\)的格子染色,问至少有一行或一列只有一种颜色的方案数.\((n≤10^6)\) ...

  6. 【CodeForces 997C】Sky Full of Stars(组合计数)

    题目链接:[CodeForces 997C]Sky Full of Stars 官方题解:Codeforces Round #493 - Editorial 题目大意:有一个n×nn×nn\times ...

  7. CodeForces 997C Sky Full of Stars

    题目:点击打开链接 题意:给n*n个格子,每个格子可以填3种颜色.问有多少种填色方案,至少有一列或一行是同色的. 分析:首先反过来考虑,找不幸运的组合,因为这样便于容斥.  要把列和行分开考虑.  首 ...

  8. CF 997C Sky Full of Stars

    传送门 题目大意 思路 参考代码 总结 传送门 题目大意 有一个 n×n(n≤106)n×n(n≤106)n \times n \pod {n \le 10^6} 的正方形网格.用三种颜色对每个格子染 ...

  9. CodeForces - 997C Sky Full of Stars

    题面在这里! 题解见注释 /*设至少有i行,j列是一种颜色的方案数为 f(i,j)那么:1.i==0||j==0 时 , f(i,j) = C(n,i) * C(n,j) * 3^( (n-i)*(n ...

最新文章

  1. Eclipse关联JDK源码
  2. 服务器更换硬盘+内存
  3. 《我也能做CTO之程序员职业规划》写作过程重播之二
  4. 将多个csv文件导入到pandas中并串联到一个DataFrame中
  5. 类方法classmethod 绑定方法
  6. Servlet的第一个程序HelloWorld
  7. Lync Server 2010迁移至Lync Server 2013部署系列 Part3:部署后端备用服务器
  8. C语言 __VA_ARGS__ - C语言零基础入门教程
  9. excel函数学习系列一
  10. 温度转换问题——从C到Python
  11. 微信小程序登录小实例
  12. 威联通配置docker同步阿里云盘
  13. IDEA 奇淫 插件
  14. vue中加载maptalks图标(markers)点击事件InfoWindow添加按钮点击事件
  15. win10安装红警运行出现FATALString Manager failed to initilaized properly
  16. com.netflix.client.ClientException: Load balancer does not have available server for client: userser
  17. 《变形金刚》成为现实 机器人变坦克
  18. threejs指南针【控制中心计算角度】
  19. L. Poor God Water(ACM-ICPC 2018 焦作赛区网络预赛,ac自动机+矩阵快速幂 或 BM线性递推)
  20. ie11对象不支持此属性和方法 ie11的缓存问题

热门文章

  1. 如何才能实现MES系统标准化
  2. ZBrush球体起形
  3. navicat mysql 计划任务_navicat创建MySql定时任务的方法详解
  4. 2022 年最新的实体识别抽取模型框架W2NER
  5. html中有哪些单标签和双标签?
  6. 实用宝典 | 如何用Python实现人机猜拳小游戏
  7. 普宁跨境电商外贸 阿里国际 之100%点击的开发信标题
  8. 使用Overleaf制作个人简历
  9. 为什么腾讯游戏金牌建模师都钟意这3款软件?年薪88W是爱吗?
  10. 通常所说的“存储保护“的基本含义