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. EditText ------- 键盘类型

    文本输入框指定软键盘类型和软键盘回车键图标设置, 转载:http://blog.csdn.net/wirelessqa/article/details/8567327

  2. spring中关于FeignClient的错误 QueryParam.value() was empty on parameter 1

    现创建一个feignClient的接口,在其他服务调用改client时发现服务启动失败错误日志如下: org.springframework.beans.factory.BeanCreationExc ...

  3. zoj3659(经典并查集)

    这种思想很经典. 从最小的边选择,那么可以知道的是,在除去这条边的另外两个联通块,选其中一块中的点做为源点到另一块所得到的费用和. 如果你已经知道了这两个联通块内部选一个点时的最大费用和.那么这题就可 ...

  4. 【MarkDown】使用Html样式和折叠语法

    MarkDown很方便,但基本语法有些不足:比如无法使用折叠语法,无法让文字有不同的颜色. 这些功能可以实现,不过需要使用Html语法进行扩展.这篇文章主要是整理一下这些技巧,方便更好的使用. 一.折 ...

  5. 微软MVP Round Table

    2017年7月7日,微软VS圈子的老大兼女神Julia(潘正磊)以及Peter Hu等人,和若干MVP一起在进行了一次Round Table讨论. 讨论过程中主要针对VS和TFS/VSTS相关的功能. ...

  6. PAT 1014 Waiting in Line (模拟)

    1014. Waiting in Line (30) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Suppo ...

  7. Intellij IDEA Ultimate Edition 14.1 破解

    key:IDEA value:61156-YRN2M-5MNCN-NZ8D2-7B4EW-U12L4 (2) key:huangwei value:97493-G3A41-0SO24-W57LI-Y2 ...

  8. 大话Python程序的命名规范

    1.全局变量名: 全部大写 MY_GLOBAL_VAR 2. 类名: 首字母大写,总是使用首字母大写单词串,如MyClass,内部类可以使用额外的前导下划线: 3.普通变量,普通函数名,文件名: 全部 ...

  9. UNION ALL与UNION

    UNION 操作符用于合并两个或多个 SELECT 语句的结果集. 请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列.列也必须拥有相似的数据类型.同时,每条 SELECT 语句中的列 ...

  10. Oracle的服务介绍以及正常运行必须启动的服务

    成功安装Oracle 11g数据库后,你会发现自己电脑运行速度会变慢,配置较低的电脑甚至出现非常卡的状况,通过禁止非必须开启的Oracle服务可以提升电脑的运行速度.那么,具体该怎么做呢? 按照win ...