博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【bzoj4806~bzoj4808】炮车马后——象棋四连击
阅读量:7003 次
发布时间:2019-06-27

本文共 3000 字,大约阅读时间需要 10 分钟。

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} $

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

  代码:

#include
#include
#include
#include
#include
#include
#include
#include
#define ll long long#define max(a,b) (a>b?a:b)#define min(a,b) (a
1)f[i][j][k]+=f[i-1][j+2][k-2]*(j+2)*(j+1)/2; f[i][j][k]%=mod; } ll ans=0; for(j=0;j<=m;j++) for(k=0;k+j<=m;k++) ans=(ans+f[n][j][k])%mod; printf("%lld\n",ans); }
bzoj4806

bzoj4807——车

  题目传送门:

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

  代码:

#include
#include
#include
#include
#include
#include
#include
#include
#include
#define ll long long#define ull unsigned long long#define max(a,b) (a>b?a:b)#define min(a,b) (a
>=1){ if(b&1)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[60]; friend hp operator * (hp a,int b){ int tmp=0; hp c; memset(&c,0,sizeof(c)); for(int i=0;i<50;i++){ tmp=tmp+b*a.num[i]; c.num[i]=tmp%10; tmp/=10; } return c; } void print(hp a){ int k=49; while(k&&!a.num[k])--k; for(int i=k;i>=0;i--) printf("%d",a.num[i]); printf("\n"); }};ll p[maxn],mn[maxn],tot[maxn];int n,m,cnt=0;void eular(int n){ for(int i=2;i<=n;i++){ if(!mn[i])mn[i]=++cnt,p[cnt]=i; for(int j=1;j<=mn[i]&&1ll*i*p[j]<=n;j++) mn[i*p[j]]=j; }}int main(){ n=read(); m=read(); if(n
bzoj4807

bzoj4808——马

  题目传送门:

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

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

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

  代码:

#include
#include
#define min(a,b) (a
=n||yy<0||yy>=m)continue; add(i*m+j+1,xx*m+yy+1,1); } } for(int i=0;i
bzoj4808

bzoj4809——皇后

  题目传送门:

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

  代码:

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

 

转载于:https://www.cnblogs.com/quzhizhou/p/10072808.html

你可能感兴趣的文章
Linux 虚拟化实践之KVM
查看>>
DigitalOcean的旅程:从被TechStars拒绝走向云托管服务宠儿
查看>>
脚踏编程及接线方法
查看>>
Linux第三周作业
查看>>
Java邮箱验证
查看>>
@exceptionhandler 没有起作用,捕获不到异常
查看>>
初探SElinux
查看>>
elasticsearch之cluster模块
查看>>
dubbo源码分析系列(4)dubbo通信设计
查看>>
java报表中AIX字体丢失解决方案
查看>>
学习Perl 第2讲
查看>>
使用AJAX的最简单示例
查看>>
JAVA常用类
查看>>
Java SE 7新特性:创建泛型实例时自动类型推断
查看>>
面试问题之:JSON是什么?
查看>>
创建plist
查看>>
性能测试的几种类型
查看>>
重庆工业赋能创新中心项目签约并正式揭牌
查看>>
如何正确处理 InterruptedException
查看>>
程序员必备系列:开发工具的安装和使用
查看>>