这个时候考过:安师大附中集训 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的更多相关文章

  1. hdu1796:容斥入门题

    简单的容斥入门题.. 容斥基本的公式早就知道了,但是一直不会写. 下午看到艾神在群里说的“会枚举二进制数就会容斥”,后来发现还真是这样.. 然后直接贴代码了 #include <iostream ...

  2. 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 ...

  3. HDU 6106 17多校6 Classes(容斥简单题)

    Problem Description The school set up three elective courses, assuming that these courses are A, B, ...

  4. [Hdu-5155] Harry And Magic Box[思维题+容斥,计数Dp]

    Online Judge:Hdu5155 Label:思维题+容斥,计数Dp 题面: 题目描述 给定一个大小为\(N*M\)的神奇盒子,里面每行每列都至少有一个钻石,问可行的排列方案数.由于答案较大, ...

  5. bzoj4665 小w的喜糖(dp+容斥)

    4665: 小w的喜糖 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 222  Solved: 130[Submit][Status][Discuss ...

  6. 【洛谷】1600:天天爱跑步【LCA】【开桶】【容斥】【推式子】

    P1600 天天爱跑步 题目描述 小c同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.<天天爱跑步>是一个养成类游戏,需要玩家每天按时上线,完成打卡任务. 这个 ...

  7. 【BZOJ3622】已经没有什么好害怕的了(动态规划,容斥)

    [BZOJ3622]已经没有什么好害怕的了(动态规划,容斥) 题面 BZOJ 题解 很明显的,这类问题是要从至少变成恰好的过程,直接容斥即可. 首先我们要求的是(糖果>药片)=(药片>糖果 ...

  8. 【BZOJ1853】幸运数字(搜索,容斥)

    [BZOJ1853]幸运数字(搜索,容斥) 题面 BZOJ 洛谷 题解 成功轰下洛谷rk1,甚至超越了一个打表选手 这题思路很明显吧,先搞出来所有范围内的合法数字,然后直接容斥, 容斥的话显然没有别的 ...

  9. 【BZOJ4455】小星星(动态规划,容斥)

    [BZOJ4455]小星星(动态规划,容斥) 题面 BZOJ 洛谷 Uoj 题解 题意说简单点就是给定一张\(n\)个点的图和一棵\(n\)个点的树,现在要让图和树之间的点一一对应,并且如果树上存在一 ...

随机推荐

  1. C#—Nhibernate使用教程

    本篇文章,让我们一起来探索Nhibernate.首先我们去搜索Nhibernate下载地址,如下链接所示.该版本可能是最新版,我下载的4.0.4.GA.其中GA意思我没搞清楚.不过应该不重要.http ...

  2. 在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 ...

  3. 5款vue前端UI框架

    Vue.js是一套构建用户界面的 渐进式框架.与其他重量级框架不同的是,Vue 采用自底向上增量开发的设计. 实用的 Vue.js组件库可以帮助我们快速搭建页面,下面介绍小编认为比较受欢迎的五个vue ...

  4. centos7下安装iperf时出现 make: *** No targets specified and no makefile found. Stop.的解决方案

    我们在Linux 安装包的时候,使用make 命令出现:"make:*** No targets specified and no makefile found.Stop."这样的 ...

  5. MySQL-第十四篇事务管理

    1.什么是事务 事务是由一步或者几步数据库操作序列组成的逻辑执行单元,这系列操作要么全部执行,要么全部放弃执行. 2.事务具备的4个特性: 1>原子性(Atomicity):事务是应用中最小的执 ...

  6. dfs(魔力转圈圈)

    http://oj.jxust.edu.cn/contest/problem?id=1563&pid=4 题目描述 Storm有一个m行n列的整数矩阵. 他会从(1,1)开始,顺时针螺旋访问该 ...

  7. [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)有多少对. ...

  8. [BZOJ 2989]数列(CDQ 分治+曼哈顿距离与切比雪夫距离的转化)

    [BZOJ 2989]数列(CDQ 分治) 题面 给定一个长度为n的正整数数列a[i]. 定义2个位置的graze值为两者位置差与数值差的和,即graze(x,y)=|x-y|+|a[x]-a[y]| ...

  9. (五:NIO系列) Reactor模式

    出处:Reactor模式 本文目录 1. 为什么是Reactor模式 2. Reactor模式简介 3. 多线程IO的致命缺陷 4. 单线程Reactor模型 4.1. 什么是单线程Reactor呢? ...

  10. java 标识接口的作用

    标识接口的作用 标识接口是没有任何方法和属性的接口.标识接口不对实现它的类有任何语义上的要求,它仅仅表明实现它的类属于一个特定的类型. 标接口在Java语言中有一些很著名的应用,例如我们常用的Arra ...