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\)个格子的矩形,求至少有一行或 ...
随机推荐
- Java编程的逻辑 (80) - 定时任务的那些坑
本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http: ...
- 安装 Xshell 5/6 时出现.dll以及0xc000007错误的解决
安装 Xshell 5/6 时出现.dll以及0xc000007错误的解决 问题:缺少 mfc110.dll或者是其他.dll文件以及应用程序运行错误,如下所示. 方法: 一种是网上直接下载.(缺少. ...
- Go语言_range(范围)理解
一.Go语言中的range Go 语言中 range 关键字用于 for循环中迭代数组(array).切片(slice).链表(channel)或集合(map)的元素: 在数组和切片中它返回元素的索引 ...
- IDEA 最新版破解教程图解
一.打开此网站 http://idea.lanyus.com 并下载红色框框内的包 二.拷贝到idea 安装目录bin文件下 三.编辑 idea64.exe.vmoptions 和 idea.exe. ...
- Oracle DBA神器之Toad
很早就听说Toad功能很强大,一直没有使用过,因为PLSQL Developer就很好用.前几天看见同事优化Oracle就是用的Toad,有一些很强大的管理功能,于是再一次对Toad产生兴趣,收集了一 ...
- JAVA程序员_常用英语
干程序员这行实在是离不开英语,干程序员是一项很辛苦的工作,要成为一个高水平的程序员尤为艰难.这是因为计算机软件技术更新的速度越来越快,而这些技术大多来源于英语国家,我们在引进这些技术时往往受到语言障碍 ...
- Android Studio开发第一篇QuickStart
为什么把as的环境开发放在gradle里呢,因为eclipse里装gradle插件还是不够方便,as直接集成了,然后正好as也是大势所趋,学习一下正好. 看到右边Quick Start快速启动栏下面 ...
- Spring mvc 接口枚举类型数据格式化处理
一.背景简述 首先,我们都知道枚举实例有两个默认属性,name 和 ordinal,可通过 name()和ordinal()方法分别获得.其中 name 为枚举字面量(如 MALE,FEMALE),o ...
- Flask web开发之路六
紧接着上篇文档,写模板继承和block,URL链接和加载静态文件 模板继承和block 项目结构 主app文件代码: from flask import Flask,render_template a ...
- Semver(语义化版本号)扫盲
最近Github 10周年在朋友圈里沸沸扬扬刷屏,小编在工作中却惊讶的发现不少同事对版本号中的beta和rc没有概念,使用 npm install package@next 时,也不清楚next代表的 ...