再探容斥好题——ROOK

这个时候考过:安师大附中集训 Day2
当时看shadowice1984的做法,但是没有亲自写,,,
雅礼集训考试的时候鼓捣半天,被卡常到80pts,要跑9s
卡不动。
正解实际是:
3重容斥
1.随便选-一个对角线空+两个对角线空
2.2^m枚举每一个位置放不放
3.对角线空——若干个位置不空,再容斥
A.一个对角线,枚举i个放在对角线上,C(*,i)组合数,剩下的方案数是(n-sz-i)!
B.两个对角线,按圈DP,f[i][j]i圈,选了j个在对角线上方案数。枚举四个角放一个、对角放两个,都不放7种情况。
常数很小。
#include<bits/stdc++.h>
#define reg register int
#define il inline
#define fi first
#define se second
#define mk(a,b) make_pair(a,b)
#define numb (ch^'0')
#define pb push_back
#define solid const auto &
#define enter cout<<endl
#define pii pair<int,int>
using namespace std;
typedef long long ll;
template<class T>il void rd(T &x){
char ch;x=;bool fl=false;while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);
for(x=numb;isdigit(ch=getchar());x=x*+numb);(fl==true)&&(x=-x);}
template<class T>il void output(T x){if(x/)output(x/);putchar(x%+'');}
template<class T>il void ot(T x){if(x<) putchar('-'),x=-x;output(x);putchar(' ');}
template<class T>il void prt(T a[],int st,int nd){for(reg i=st;i<=nd;++i) ot(a[i]);putchar('\n');}
namespace Modulo{
const int mod=;
il int ad(int x,int y){return x+y>=mod?x+y-mod:x+y;}
il int sub(int x,int y){return ad(x,mod-y);}
il int mul(int x,int y){return (ll)x*y%mod;}
il void inc(int &x,int y){x=ad(x,y);}
il void inc2(int &x,int y){x=mul(x,y);}
il int qm(int x,int y=mod-){int ret=;while(y){if(y&) ret=mul(x,ret);x=mul(x,x);y>>=;}return ret;}
template<class ...Args>il int ad(const int a,const int b,const Args &...args) {return ad(ad(a,b),args...);}
template<class ...Args>il int mul(const int a,const int b,const Args &...args) {return mul(mul(a,b),args...);}
}
using namespace Modulo;
namespace Miracle{
const int N=;
const int M=;
int n,m;
int X[M],Y[M];
int hk[N],lk[N];
int f[N][N];
int c[N][N];
int jie[N],inv[N];
int C(int n,int m){
if(n<||m<||n<m) return ;
return c[n][m];
}
int ans,two,one1,one2;
int dp1(int sz){
int lim=n;
for(reg i=;i<=n;++i){
lim-=(hk[i]|lk[i]);
}
int ret=;
for(reg i=;i<=lim;++i){
inc(ret,mul(C(lim,i),jie[n-sz-i],i&?mod-:));
}
return ret;
}
int dp2(int sz){
int ret=;
int lim=n;
for(reg i=;i<=n;++i){
lim-=(hk[i]|lk[n-i+]);
}
for(reg i=;i<=lim;++i){
inc(ret,mul(C(lim,i),jie[n-sz-i],i&?mod-:));
}
return ret;
}
int dp3(int sz){
memset(f,,sizeof f); // cout<<"dp3----------- "<<sz<<endl;
// prt(hk,1,n);
// prt(lk,1,n); int U,D,L,R;
int up=(n)/;
int lim=n-sz;
if(n&){
U=D=L=R=(n+)/;
f[][]=;
f[][]=(lk[L]==&&hk[U]==);
--U;--L;++R;++D;
}else{
U=L=(n/);D=R=(n/)+;
f[][]=;
}
for(reg i=;i<up;++i){
int o=min(*i+(n&),lim);
for(reg j=;j<=o;++j){
if(f[i][j]){
int v=f[i][j];
inc(f[i+][j],v);
// if(lk[R]+hk[U]==0)inc(f[i+1][j+1],v);
// if(lk[R]+hk[D]==0)inc(f[i+1][j+1],v);
// if(lk[L]+hk[U]==0)inc(f[i+1][j+1],v);
// if(lk[L]+hk[D]==0)
inc(f[i+][j+],mul((lk[R]+hk[U]==)+(lk[R]+hk[D]==)+(lk[L]+hk[U]==)+(lk[L]+hk[D]==),v)); if(lk[R]+hk[U]==&&lk[L]+hk[D]==)inc(f[i+][j+],v);
if(lk[R]+hk[D]==&&lk[L]+hk[U]==)inc(f[i+][j+],v);
}
}
--U;--L;++R;++D;
}
int ret=;
for(reg j=;j<=lim;++j){
inc(ret,mul(f[up][j],jie[n-sz-j],j&?mod-:));
}
// cout<<" ret "<<ret<<endl;
return ret;
}
int dp4(int sz){
return jie[n-sz];
}
void clear(){
memset(f,,sizeof f);
memset(X,,sizeof X);
memset(Y,,sizeof Y);
ans=;
one1=;one2=;two=;
}
int main(){ int t;
rd(t);
c[][]=;
n=;
for(reg i=;i<=n;++i){
c[i][]=;
for(reg j=;j<=n;++j){
c[i][j]=ad(c[i-][j],c[i-][j-]);
}
}
jie[]=;
for(reg i=;i<=n;++i) jie[i]=mul(jie[i-],i); while(t--){
clear();
rd(n);rd(m);
for(reg i=;i<=m;++i){
rd(X[i]);rd(Y[i]);
++X[i];++Y[i];
}
// ans=1;
// for(reg i=1;i<=n;++i) inc2(ans,i);
ans=; for(reg s=;s<(<<m);++s){
memset(hk,,sizeof hk);
memset(lk,,sizeof lk);
int sz=__builtin_popcount(s);
int c=(sz&)?mod-:;
bool fl1=true,fl2=true,fl=true;
for(reg i=;i<=m;++i){
if((s>>(i-))&){
if(X[i]==Y[i]) fl1=false;
if(X[i]+Y[i]==n+) fl2=false;
if(hk[X[i]]) fl=false;
++hk[X[i]];
if(lk[Y[i]]) fl=false;
++lk[Y[i]];
}
}
// cout<<" s "<<s<<" "<<fl1<<" "<<fl2<<" "<<fl<<endl;
if(fl&&fl1){
inc(one1,mul(c,dp1(sz)));
}
if(fl&&fl2){
inc(one2,mul(c,dp2(sz)));
}
if(fl&&fl1&&fl2){
inc(two,mul(c,dp3(sz)));
}
if(fl){
inc(ans,mul(c,dp4(sz)));
}
}
// cout<<" one1 "<<one1<<endl;
// cout<<" one2 "<<one2<<endl;
// cout<<" two "<<two<<endl;
inc(ans,ad(mod-one1,mod-one2,two));
// cout<<ans<<endl;l
printf("%d\n",ans);
}
return ;
} }
signed main(){
// freopen("rook.in","r",stdin);
// freopen("rook.out","w",stdout);
Miracle::main();
return ;
} /*
Author: *Miracle*
*/
疯狂容斥
对角线至少选择一个这种很麻烦。必须考虑有没有选择。
格子都不能选很麻烦。要考虑给后面预留,只能状压
对角线>=1——>都是0
都是0——>有一些放了
格子都不能选——>一些可以选
以及按圈DP
对称,方便同时处理可能产生矛盾的情况,避免状压。
再探容斥好题——ROOK的更多相关文章
- hdu1796:容斥入门题
简单的容斥入门题.. 容斥基本的公式早就知道了,但是一直不会写. 下午看到艾神在群里说的“会枚举二进制数就会容斥”,后来发现还真是这样.. 然后直接贴代码了 #include <iostream ...
- hdu 1796 How many integers can you find 容斥第一题
How many integers can you find Time Limit: 12000/5000 MS (Java/Others) Memory Limit: 65536/32768 ...
- HDU 6106 17多校6 Classes(容斥简单题)
Problem Description The school set up three elective courses, assuming that these courses are A, B, ...
- [Hdu-5155] Harry And Magic Box[思维题+容斥,计数Dp]
Online Judge:Hdu5155 Label:思维题+容斥,计数Dp 题面: 题目描述 给定一个大小为\(N*M\)的神奇盒子,里面每行每列都至少有一个钻石,问可行的排列方案数.由于答案较大, ...
- bzoj4665 小w的喜糖(dp+容斥)
4665: 小w的喜糖 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 222 Solved: 130[Submit][Status][Discuss ...
- 【洛谷】1600:天天爱跑步【LCA】【开桶】【容斥】【推式子】
P1600 天天爱跑步 题目描述 小c同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.<天天爱跑步>是一个养成类游戏,需要玩家每天按时上线,完成打卡任务. 这个 ...
- 【BZOJ3622】已经没有什么好害怕的了(动态规划,容斥)
[BZOJ3622]已经没有什么好害怕的了(动态规划,容斥) 题面 BZOJ 题解 很明显的,这类问题是要从至少变成恰好的过程,直接容斥即可. 首先我们要求的是(糖果>药片)=(药片>糖果 ...
- 【BZOJ1853】幸运数字(搜索,容斥)
[BZOJ1853]幸运数字(搜索,容斥) 题面 BZOJ 洛谷 题解 成功轰下洛谷rk1,甚至超越了一个打表选手 这题思路很明显吧,先搞出来所有范围内的合法数字,然后直接容斥, 容斥的话显然没有别的 ...
- 【BZOJ4455】小星星(动态规划,容斥)
[BZOJ4455]小星星(动态规划,容斥) 题面 BZOJ 洛谷 Uoj 题解 题意说简单点就是给定一张\(n\)个点的图和一棵\(n\)个点的树,现在要让图和树之间的点一一对应,并且如果树上存在一 ...
随机推荐
- C#—Nhibernate使用教程
本篇文章,让我们一起来探索Nhibernate.首先我们去搜索Nhibernate下载地址,如下链接所示.该版本可能是最新版,我下载的4.0.4.GA.其中GA意思我没搞清楚.不过应该不重要.http ...
- 在centos7.4 nginx mysql php部署 thinkphp5.0 项目
系统 centos7 环境 php 7.1.3 nignx 1.12.2 mysql 5.5.6 我是通过lnmp 集成环境安装 fastcgi.conf 末尾添加 vim fastcig.conf ...
- 5款vue前端UI框架
Vue.js是一套构建用户界面的 渐进式框架.与其他重量级框架不同的是,Vue 采用自底向上增量开发的设计. 实用的 Vue.js组件库可以帮助我们快速搭建页面,下面介绍小编认为比较受欢迎的五个vue ...
- centos7下安装iperf时出现 make: *** No targets specified and no makefile found. Stop.的解决方案
我们在Linux 安装包的时候,使用make 命令出现:"make:*** No targets specified and no makefile found.Stop."这样的 ...
- MySQL-第十四篇事务管理
1.什么是事务 事务是由一步或者几步数据库操作序列组成的逻辑执行单元,这系列操作要么全部执行,要么全部放弃执行. 2.事务具备的4个特性: 1>原子性(Atomicity):事务是应用中最小的执 ...
- dfs(魔力转圈圈)
http://oj.jxust.edu.cn/contest/problem?id=1563&pid=4 题目描述 Storm有一个m行n列的整数矩阵. 他会从(1,1)开始,顺时针螺旋访问该 ...
- [BZOJ 2820] YY的gcd(莫比乌斯反演+数论分块)
[BZOJ 2820] YY的gcd(莫比乌斯反演+数论分块) 题面 给定N, M,求\(1\leq x\leq N, 1\leq y\leq M\)且gcd(x, y)为质数的(x, y)有多少对. ...
- [BZOJ 2989]数列(CDQ 分治+曼哈顿距离与切比雪夫距离的转化)
[BZOJ 2989]数列(CDQ 分治) 题面 给定一个长度为n的正整数数列a[i]. 定义2个位置的graze值为两者位置差与数值差的和,即graze(x,y)=|x-y|+|a[x]-a[y]| ...
- (五:NIO系列) Reactor模式
出处:Reactor模式 本文目录 1. 为什么是Reactor模式 2. Reactor模式简介 3. 多线程IO的致命缺陷 4. 单线程Reactor模型 4.1. 什么是单线程Reactor呢? ...
- java 标识接口的作用
标识接口的作用 标识接口是没有任何方法和属性的接口.标识接口不对实现它的类有任何语义上的要求,它仅仅表明实现它的类属于一个特定的类型. 标接口在Java语言中有一些很著名的应用,例如我们常用的Arra ...