bzoj4806——炮

  题目传送门:bzoj4806

  这种题一看就是dp。。。我们可以设$ f[i][j][k] $表示处理到第$ i $行,有$ j $列没放炮,$ k $列只放了一个炮。接着分情况讨论:第$ i $行不放炮、放一个炮、放两个炮;放在只有一个炮的列上,还是放在没炮的列上。于是就可以快乐地列方程了:

  $ \begin{equation} \begin{split} f[i][j][k] &= f[i-1][j][k] \\ &+ (j+1)\cdot f[i-1][j+1][k-1] \\ &+ (k+1)\cdot f[i-1][j][k+1] \\ &+ \binom{j+2}{2} \cdot f[i-1][j+2][k-2] \\ &+ (j+1)\cdot k\cdot f[i-1][j+1][k] \\ &+ \binom{k+2}{2}\cdot f[i-1][j][k+2] \end{split} \end{equation} $

  另外,此题有双倍经验:bzoj1801(我是不会告诉你模数不一样的)

  代码:

#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<ctime>
#include<algorithm>
#include<queue>
#include<vector>
#define ll long long
#define max(a,b) (a>b?a:b)
#define min(a,b) (a<b?a:b)
#define inf 0x7fffffff
#define mod 999983
#define eps 1e-20
ll read()
{
ll tmp=; char c=getchar(),f=;
for(;c<''||''<c;c=getchar())if(c=='-')f=-;
for(;''<=c&&c<='';c=getchar())tmp=tmp*+c-'';
return tmp*f;
}
using namespace std;
ll f[][][];
int n,m;
int main()
{
int i,j,k;
n=read(); m=read();
f[][m][]=;
for(i=;i<=n;i++)
for(j=;j<=m;j++)
for(k=;k+j<=m;k++){
f[i][j][k]=f[i-][j][k]+f[i-][j][k+]*(k+)+f[i-][j][k+]*(k+)*(k+)/+f[i-][j+][k]*k*(j+);
if(k)f[i][j][k]+=f[i-][j+][k-]*(j+);
if(k>)f[i][j][k]+=f[i-][j+][k-]*(j+)*(j+)/;
f[i][j][k]%=mod;
}
ll ans=;
for(j=;j<=m;j++)
for(k=;k+j<=m;k++)
ans=(ans+f[n][j][k])%mod;
printf("%lld\n",ans);
}

bzoj4806

bzoj4807——车

  题目传送门:bzoj4807

  这题一看就是组合数。。。就是加了个高精度罢了。

  代码:

#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<ctime>
#include<algorithm>
#include<queue>
#include<vector>
#include<map>
#define ll long long
#define ull unsigned long long
#define max(a,b) (a>b?a:b)
#define min(a,b) (a<b?a:b)
#define lowbit(x) (x& -x)
#define mod 1000000007
#define inf 0x3f3f3f3f
#define eps 1e-18
#define maxn 1000010
inline ll read(){ll tmp=; char c=getchar(),f=; for(;c<''||''<c;c=getchar())if(c=='-')f=-; for(;''<=c&&c<='';c=getchar())tmp=(tmp<<)+(tmp<<)+c-''; return tmp*f;}
inline ll power(ll a,ll b){ll ans=; for(;b;b>>=){if(b&)ans=ans*a%mod; a=a*a%mod;} return ans;}
inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
inline void swap(int &a,int &b){int tmp=a; a=b; b=tmp;}
using namespace std;
struct hp{
char num[];
friend hp operator * (hp a,int b){
int tmp=; hp c;
memset(&c,,sizeof(c));
for(int i=;i<;i++){
tmp=tmp+b*a.num[i];
c.num[i]=tmp%; tmp/=;
}
return c;
}
void print(hp a){
int k=;
while(k&&!a.num[k])--k;
for(int i=k;i>=;i--)
printf("%d",a.num[i]);
printf("\n");
}
};
ll p[maxn],mn[maxn],tot[maxn];
int n,m,cnt=;
void eular(int n)
{
for(int i=;i<=n;i++){
if(!mn[i])mn[i]=++cnt,p[cnt]=i;
for(int j=;j<=mn[i]&&1ll*i*p[j]<=n;j++)
mn[i*p[j]]=j;
}
}
int main()
{
n=read(); m=read();
if(n<m)swap(n,m);
eular(n);
for(int i=;i<=cnt;i++)
for(ll j=p[i];j<=n;j*=p[i])
tot[i]+=n/j;
for(int i=;i<=cnt;i++)
for(ll j=p[i];j<=m;j*=p[i])
tot[i]-=m/j;
for(int i=;i<=cnt;i++)
for(ll j=p[i];j<=n-m;j*=p[i])
tot[i]-=(n-m)/j;
hp ans;
memset(&ans,,sizeof(ans)); ans.num[]=;
for(int i=;i<=cnt;i++)
for(int j=;j<=tot[i];j++)
ans=ans*p[i];
ans.print(ans);
}

bzoj4807

bzoj4808——马

  题目传送门:bzoj4808

  其实如果把棋盘相邻块黑白染色,那么我们可以发现马每跳一步只会跳到异色格,所以直接互相连边,跑二分图匹配就行了。

  听说您像我一样用dinic跑二分图匹配?那得加当前弧优化。(至少我要加才能过)

  另外,此题也有双倍经验:bzoj3175

  代码:

#include<cstdio>
#include<cstring>
#define min(a,b) (a<b?a:b)
#define inf 0x3f3f3f3f
using namespace std;
const int dx[]={,-,,-,,-,,-},dy[]={,,,,-,-,-,-};
struct edge{
int to,nxt,flow;
}e[];
int fir[],lv[],q[],cur[];
int mp[][];
int n,m,S,T,tot=;
void add(int x,int y,int flow)
{
e[tot].to=y; e[tot].flow=flow; e[tot].nxt=fir[x]; fir[x]=tot++;
e[tot].to=x; e[tot].flow=; e[tot].nxt=fir[y]; fir[y]=tot++;
}
int dfs(int now,int flow)
{
if(now==T)return flow;
int tot=;
for(int i=cur[now];~i;i=e[i].nxt)
if(e[i].flow&&lv[e[i].to]==lv[now]+){
cur[now]=i;
int tmp=dfs(e[i].to,min(flow,e[i].flow));
e[i].flow-=tmp; e[i^].flow+=tmp;
tot+=tmp; flow-=tmp;
if(!flow)break;
}
return tot;
}
int dinic()
{
int i,ans=;
while(){
for(i=;i<=T;i++)lv[i]=,cur[i]=fir[i];
int h=,t=; q[]=S; lv[S]=;
while(h<=t){
for(i=fir[q[h]];~i;i=e[i].nxt)
if(e[i].flow&&!lv[e[i].to]){
q[++t]=e[i].to; lv[e[i].to]=lv[q[h]]+;
}
++h;
}
if(!lv[T])return ans;
int k=dfs(S,inf);
while(k)ans+=k,k=dfs(S,inf);
}
}
int main()
{
memset(fir,,sizeof(fir));
scanf("%d%d",&n,&m); S=; T=n*m+;
int cnt=;
for(int i=;i<n;i++)
for(int j=;j<m;j++)
scanf("%d",&mp[i][j]),cnt+=!mp[i][j];
for(int i=;i<n;i++)
for(int j=;j<m;j++)
if((i^j)&){
for(int k=;k<;k++){
int xx=i+dx[k],yy=j+dy[k];
if(xx<||xx>=n||yy<||yy>=m)continue;
add(i*m+j+,xx*m+yy+,);
}
}
for(int i=;i<n;i++)
for(int j=;j<m;j++)
if(!mp[i][j]){
if((i^j)&)add(S,i*m+j+,);
else add(i*m+j+,T,);
}
printf("%d\n",cnt-dinic());
}

bzoj4808

bzoj4809——皇后

  题目传送门:bzoj4810

  其实数据水,爆搜就能过,而且这道题好像也没什么靠谱的解法。

  代码:

#include<cstdio>
int mp[][],vis0[],vis1[],vis2[];
int n,ans=;
void dfs(int now)
{
if(now>n){
++ans; return;
}
for(int i=;i<=n;i++)
if(!mp[now][i]&&!vis0[i]&&!vis1[now+i]&&!vis2[n+now-i]){
vis0[i]=; vis1[now+i]=; vis2[n+now-i]=;
dfs(now+);
vis0[i]=; vis1[now+i]=; vis2[n+now-i]=;
}
}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
scanf("%d",&mp[i][j]);
dfs();
printf("%d\n",ans);
}

bzoj4810

【bzoj4806~bzoj4808】炮车马后——象棋四连击的更多相关文章

  1. 【bzoj4806~bzoj4809】 象棋四连发 DP-高精度-匈牙利算法-dfs

    都是经典题了吧..我好无聊.. 4806 4806-1801是双倍经验..DP方程看代码吧.. /* http://www.cnblogs.com/karl07/ */ #include <cs ...

  2. BZOJ 4806 - 4809 象棋四题

    4806: 炮 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 103  Solved: 72[Submit][Status][Discuss] Des ...

  3. zabbix系列之九——安装后配置四web监控

    1web监控 描述 详细 备注 概要 1)      需要定义 web 场景(包括一个或多个 HTTP请求),zabbix服务器根据预定义的命令周期性的执行这些步骤. 2)      Web 场景和 ...

  4. 【BZOJ4808/3175】马/[Tjoi2013]攻击装置 最小割

    [BZOJ4808]马 Description 众所周知,马后炮是中国象棋中很厉害的一招必杀技."马走日字".本来,如果在要去的方向有别的棋子挡住(俗称"蹩马腿" ...

  5. 利用shiro反序列化注入冰蝎内存马

    利用shiro反序列化注入冰蝎内存马 文章首发先知社区:https://xz.aliyun.com/t/10696 一.shiro反序列化注入内存马 1)tomcat filter内存马 先来看一个普 ...

  6. windows server 2008镜像重启后密码变为默认密码的问题的解决方案

    1. cmd中执行regedit,打开注册表: 修改HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Cloudbase Solusions\Cloudbase-Init ...

  7. 我的四年建站故事(X)

    今天版主们有在群里聊建站的事情了,似乎他们每个人都很热衷于搭建一个自己的网站或者博客,我突然之间觉得非常有必要做一些经验的分享.        首先我想先介绍一下CMS( 网站内容管理系统, 即 Co ...

  8. 论文阅读笔记四十四:RetinaNet:Focal Loss for Dense Object Detection(ICCV2017)

    论文原址:https://arxiv.org/abs/1708.02002 github代码:https://github.com/fizyr/keras-retinanet 摘要 目前,具有较高准确 ...

  9. sudo passwd root输入普通用户密码后显示用户不再sudoers文件中

    在写上一篇VirtualBox创建共享文件夹的时候,在运行下图授权时,root密码一直输入错误 然后我就在终端输入 su root,却发现需要密码,但我却不知道密码是什么 于是我就在终端输入如下命令, ...

随机推荐

  1. 认识tornado(四)

    接下来我们看一下helloword.py的唯一一个handler. 1 class MainHandler(tornado.web.RequestHandler): 2 def get(self): ...

  2. 拨打电话<a href="tel:">跳转到邮件<a href="mailto:">

    拨打电话 <a href="tel:0571866000">0571-866000</a> 跳转到邮件 <a href="mailto:jo ...

  3. 如何设置,使IntelliJ IDEA智能提示忽略大小写

  4. 巨蟒python全栈开发flask3

    首先,我们新建一个项目: 这个时候,我们调用ab函数,可以在所有的模板中使用. 上边是一个特殊装饰器, 1.flask特殊装饰器 下面说几个特殊的装饰器 再请求之前的装饰器 运行: 这个时候,服务端打 ...

  5. Storm-源码分析- bolt (backtype.storm.task)

    Bolt关键的接口为execute, Tuple的真正处理逻辑, 通过OutputCollector.emit发出新的tuples, 调用ack或fail处理的tuple /** * An IBolt ...

  6. Spring Data 关于Repository的介绍(四)

    Repository类的定义: public interface Repository<T, ID extends Serializable> { } 1)Repository是一个空接口 ...

  7. OVN实战---《An Introduction to OVN Routing》翻译

    Overview 在前面一篇文章的基础上,现在我将通过OVN创建一个基础的三层网络.创建的最终结果将是一对logical switches通过一个logical router相连.另外,该路由器会通过 ...

  8. Andrew Ng机器学习编程作业:Multi-class Classification and Neural Networks

    作业文件 machine-learning-ex3 1. 多类分类(Multi-class Classification) 在这一部分练习,我们将会使用逻辑回归和神经网络两种方法来识别手写体数字0到9 ...

  9. ionic真机调试Android报错 - could not read ok from ADB Server * failed to start daemon * error: cannot connect to daemon

    在使用真机调试Android程序时,报错如下: could not read ok from ADB Server * failed to start daemon error: cannot con ...

  10. Redis四(Set操作)

    1.Set操作 Set集合就是不允许重复的列表 集合操作(无序) sadd(name,values) 1 # name对应的集合中添加元素 scard(name) 1 获取name对应的集合中元素个数 ...