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)*3(n-i)(n-j)
理解其实不难理解的?就至少有i行j列相同的方案数嘛
具体来说,首先从n行中选i行,n列中选j列的方案数是C(i,n)*C(j,n),然后除了这i行这j列以外还有(n-i)(n-j)个格子,这些格子都可以随便填的,所以是3(n-i)(n-j),然后选出的这i行j列的颜色有3种可能所以最前面有个3,容斥不解释了太显然
然后这显然是个暴力,要n2地跑,过不去
所以考虑怎么优化QAQ
可以发现前面那个复杂度是对的麻油什么问题,是后面那个式子要优化嘛,所以只看后面那个式子就好
可以先把i提到前面,就变成了3*∑(-1)i+1*C(i,n)∑(-1)j*C(j,n)*3(n-i)(n-j)
然后这样子,有点麻烦,可以考虑把i替换成n-i,j替换成n-j,又因为C(n-i,n)=C(i,n),C(n-j,n)=C(j,n)
所以就变成,3*∑(-1)i+1*C(i,n)∑(-1)i+j+1*C(j,n)*3i*j,-1放进去就是3*∑(-1)i+1*C(i,n)∑*C(j,n)*(-3i)*j
然后考虑二项式定理,(a+b)n=∑C(i,n)*ai*bn-i
所以后面∑(-1)j*C(n-j,n)*3(n-i)(n-j)这一堆,就可以变成(1-3i)n
但是这里注意一下,二项式定理中的i是从0开始的,然后上面列出来的式子是从1开始的,所以加多了,所以要减一个[(-3)i]n
综上,就求个∑2*C(i,n)*(-1)i+1*3i+n*n-n+3*∑(-1)i+1*C(i,n)*[(1-3i)n-(-3i)n]
大概就这样儿,over
#include<bits/stdc++.h>
using namespace std;
#define il inline
#define ll long long
#define gc getchar()
#define rl register ll
#define rc register char
#define rb register bool
#define rp(i,x,y) for(rl i=x;i<=y;++i)
#define my(i,x,y) for(rl i=x;i>=y;--i) const ll N=+,mod=;
ll n,c[N],as; il ll read()
{
rc ch=gc;rl x=;rb y=;
while(ch!='-' && (ch>'' || ch<''))ch=gc;
if(ch=='-')ch=gc,y=;
while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=gc;
return y?x:-x;
}
il ll power(rl x,rl y){rl as=;while(y){if(y&)as=1ll*(as*x)%mod;x=1ll*(x*x)%mod;y>>=;}return as;}
il void pre(){c[]=;rp(i,,n)c[i]=c[i-]*(n-i+)%mod*power(i,mod-)%mod;} int main()
{
freopen("cf997c.out","w",stdout);
n=read();if(n==)return printf("3\n"),;pre();
rp(i,,n)as=(as+c[i]*(i&?:mod-)%mod*power(,i+n*n-n*i)%mod)%mod;as=(as<<)%mod;
rp(i,,n){rl powwer=power(,n-i);as=(as+*c[i]%mod*(i&?:mod-)%mod*(power(powwer-,n)-power(powwer,n)+mod)%mod)%mod;}
printf("%lld\n",as);
return ;
}
这儿是代码QAQ
然后港下法二
首先看上面那个,是正着推的嘛
所以考虑转化一下,变成总数-每一行每一列都不同的方案数,也就是-每一行每一列至少有2种颜色的方案数
然后这里是有两个限制嘛,一个行一个列
这里就有一个套路,就是说如果有两个限制,就把一个容斥了,另一个就能比较简单地做掉
就首先想列,首先对某一列的总共染色方案是3n,然后不合法的方案有3种,就3n-3,然后有n列,所以总的是(3n-3)n
然后考虑这样子显然还会多减去合法的行相等的情况
然后多减的是什么的,就至少有一行颜色相同且每一列至少有两种颜色的方案
所以就枚举有多少行是只有一种颜色的
一样先放式子再解释
首先C(i,n)不解释,你肯定要从n行中选出i行来嘛
然后这时候会发现其实是有两种情况的
一种是这些颜色相同的行的颜色都相同,那就只有3种颜色可以选择
然后就还会剩下n*(n-i)个格子麻油涂颜色嘛
这时候想,因为我们是在任何一列至少有两种颜色的大背景下考虑的,所以如果我们现在减了一个某一列只有一种颜色的方案就是减多了对趴
所以对这些格子n列分别考虑,对每一列,本来应该有3n-i种选择方案,然后发现如果所有格子都选了和最上面那i行颜色相同的方案就GG了,所以-1
所以这里就是3*(3n-i-1)n
还一种就他们颜色不是全部相同咯
那对这i行就有3i种方案,因为上面我们已经算过所有行都相同颜色的情况了嘛,所以要减三种,所以是3i-3
然后这时候其他格子就可以放心大胆涂辣显然不会有问题,所以3n*(n-i)
综上,这一段的式子就是C(i,n)*(3*(3n-i-1)n+(3i-3)*3n*(n-i))
最后总结一下,整个题目的式子就可以表示成3n*n-(3n-3)n-(-1)i*C(i,n)*(3*(3n-i-1)n+(3i-3)*3n*(n-i))
代码难度并不大,,,所以就懒得打了QAQ放个别人的代码QAQ
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
using namespace std;
#define MOD 998244353
#define MAX 1000100
int fpow(int a,int b){int s=;while(b){if(b&)s=1ll*s*a%MOD;a=1ll*a*a%MOD;b>>=;}return s;}
int n;
int jc[MAX],jv[MAX],inv[MAX];
int C(int n,int m){return 1ll*jc[n]*jv[m]%MOD*jv[n-m]%MOD;}
int p[MAX];
int main()
{
freopen("A.in","r",stdin);
freopen("A.out","w",stdout);
cin>>n;if(n==){puts("");return ;}
jc[]=jv[]=inv[]=inv[]=;
for(int i=;i<=n;++i)inv[i]=1ll*inv[MOD%i]*(MOD-MOD/i)%MOD;
for(int i=;i<=n;++i)jc[i]=1ll*jc[i-]*i%MOD;
for(int i=;i<=n;++i)jv[i]=1ll*jv[i-]*inv[i]%MOD;
p[]=fpow(fpow(,n)-,n)%MOD;
for(int j=;j<=n;++j)
{
int s=1ll*(fpow(,j)-)*fpow(fpow(,n-j),n)%MOD;
int QwQ=fpow(fpow(,n-j)-,n);
s=(s+3ll*QwQ)%MOD;
p[j]=1ll*C(n,j)*s%MOD;
}
int ans=p[];
for(int i=,d=MOD-;i<=n;++i,d=MOD-d)ans=(ans+1ll*d*p[i])%MOD;
ans=(fpow(fpow(,n),n)+MOD-ans)%MOD;
printf("%d\n",ans);
return ;
}
CF997C Sky Full of Stars 数论的更多相关文章
- CF997C Sky Full of Stars
CF997C Sky Full of Stars 计数好题 在Ta的博客查看 容斥式子:发现只要每个钦定方案的贡献都考虑到再配上容斥系数就是对的 O(n^2)->O(n) 把麻烦的i=0,j=0 ...
- 【题解】CF997C Sky Full of Stars
[题解]CF997C Sky Full of Stars 为什么我的容斥原理入门题是这道题????????? \(Part-1\)正向考虑 直接考虑不合法合法的方案吧 所以我们设行有\(i\),列有\ ...
- cf997C. Sky Full of Stars(组合数 容斥)
题意 题目链接 \(n \times n\)的网格,用三种颜色染色,问最后有一行/一列全都为同一种颜色的方案数 Sol Orz fjzzq 最后答案是这个 \[3^{n^2} - (3^n - 3)^ ...
- codeforces 997C.Sky Full of Stars
题目链接:codeforces 997C.Sky Full of Stars 一道很简单(?)的推式子题 直接求显然不现实,我们考虑容斥 记\(f(i,j)\)为该方阵中至少有\(i\)行和\(j\) ...
- Codeforces 997 C - Sky Full of Stars
C - Sky Full of Stars 思路: 容斥原理 题解:http://codeforces.com/blog/entry/60357 注意当i > 1 且 j > 1,是同一种 ...
- [CF997C]Sky Full of Stars_二项式反演_等比数列_容斥原理
Sky Full of Stars 题目链接:http://codeforces.com/problemset/problem/997/C 数据范围:略. 题解: 首先考虑拟对象,如果至少有一行完全相 ...
- [Codeforces 997C]Sky Full of Stars(排列组合+容斥原理)
[Codeforces 997C]Sky Full of Stars(排列组合+容斥原理) 题面 用3种颜色对\(n×n\)的格子染色,问至少有一行或一列只有一种颜色的方案数.\((n≤10^6)\) ...
- Codeforces997C Sky Full of Stars 【FMT】【组合数】
题目大意: 一个$n*n$的格子,每个格子由你填色,有三种允许填色的方法,问有一行或者一列相同的方案数. 题目分析: 标题的FMT是我吓人用的. 一行或一列的问题不好解决,转成它的反面,没有一行和一列 ...
- Codeforces.997C.Sky Full of Stars(容斥 计数)
题目链接 那场完整的Div2(Div1 ABC)在这儿.. \(Description\) 给定\(n(n\leq 10^6)\),用三种颜色染有\(n\times n\)个格子的矩形,求至少有一行或 ...
随机推荐
- Git -- 搭建git服务器
在远程仓库一节中,我们讲了远程仓库实际上和本地仓库没啥不同,纯粹为了7x24小时开机并交换大家的修改. GitHub就是一个免费托管开源代码的远程仓库.但是对于某些视源代码如生命的商业公司来说,既不想 ...
- 爱快路由计费系统easyradius隆重发布,支持V2版本,欢迎大家测试使用
随着PA.BV接口的发布的临近,我们已经对ROS及爱快V2接口进行大量的升级工作 经用户测试,各方便已满足用户需求. 其实很早以前我们就有支持爱快路由的打算,但是由于各方便原因,通讯接口做好了,但是并 ...
- python 守护进程,监控进程
守护进程代码: import time, os import subprocess def run(): while True: taskList = os.popen('tasklist').rea ...
- Python 中的map、reduce函数用法
#-*- coding:UTF-8 -*- #map()函数接受两个参数,一个是函数,一个是序列,map将传入的函数依次作用到序列的每个元素,并把结果作为新的list返回 def f(x): retu ...
- 【QT】无需写connect代码关联信号和槽函数
对于一些简单的事件判别,如点击按钮. 无需写代码关联信号和槽函数. connect(ui->Btnshowhello,SIGNAL(clicked(bool)),this,SLOT(Btnsho ...
- Golang中下划线的使用
https://studygolang.com/articles/17479?fr=sidebar
- 使用 PHP_CodeSniffer 检查 代码 是否 符合 编码规范
服务端部署:PHP_CodeSniffer HG 服务端部署篇 1.下载PHP_CodeSniffer 前往 https://github.com/squizlabs/PHP_CodeSniffer ...
- BackgroundWorker学习笔记
1 简介 BackgroundWorker 类允许您在单独的专用线程上运行操作. 耗时的操作(如下载和数据库事务)在长时间运行时可能会导致用户界面 (UI) 似乎处于停止响应状态. 如果您需要能进行响 ...
- 在springBoot中配置web.xml中配置的servlet
第一种 web.xml (截取的需要转换的) 当拦截到 /socke t时执行该servlet <servlet> <servlet-name>websocket</se ...
- js for in 获得遍历数组索引和对象属性
for in 遍历对象属性 获取的是对象的属性名 var person ={ name:"admin", age:"21", address:"sha ...