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. 关于sqlSessionTemplate

    SqlSessionTemplate是MyBatis-Spring的核心.这个类负责管理MyBatis的SqlSession,调用MyBatis的SQL方法,翻译异常.SqlSessionTempla ...

  2. mongodb在32位机的连接

    Windows 32bit版本安装Mongodb时,会发生的下面问题 2016-05-09T00:09:45.124+0800 I STORAGE  [initandlisten] exception ...

  3. 巨蟒python全栈开发-第21天 继承

    一.今日主要内容 1.了解python2和python3类的区别 python2在2.2之前使用的是经典类,2.2之后,使用的是新式类 class Foo: pass class Foo(object ...

  4. 个案排秩 Rank (linear algebra) 秩 (线性代数)

    非叫“秩”不可,有秩才有解_王治祥_新浪博客http://blog.sina.com.cn/s/blog_8e7bc4f801012c23.html 我在一个大学当督导的时候,一次我听一位老师给学生讲 ...

  5. python生成百分数

    >>> a = float(5.69875) >>> b = float(8.49385) >>> print a/b 0.67092661160 ...

  6. 接口测试工具 — jmeter(数据库操作)

    1.导入jdbc jar包 2.配置MySQL连接 3.执行sql语句

  7. 剑指Offer——重建二叉树

    题目描述: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7 ...

  8. 我的Android进阶之旅------&gt;Android无第三方Jar包的源代报错:The current class path entry belongs to container ...的解决方法

    今天使用第三方Jar包afinal.jar时候.想看一下源码,无法看 然后像加入jar相应的源代码包.也无法加入相应的源代码,报错例如以下:The current class path entry b ...

  9. Thinkphp的list_to_tree 实现无限级分类列出全部节点

    list_to_tree 使用起来十分方便,具体可查看手冊.由于我在用的时候须要同一时候列出全部节点,所以写了一个递归函数,拿出来供大家參考. public function index(){ Loa ...

  10. linux进程内存到底怎么看 剖析top命令显示的VIRT RES SHR值

    引 言: top命令作为Linux下最常用的性能分析工具之一,可以监控.收集进程的CPU.IO.内存使用情况.比如我们可以通过top命令获得一个进程使用了多少虚拟内存(VIRT).物理内存(RES). ...