4806: 炮

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 103  Solved: 72
[Submit][Status][Discuss]

Description

众所周知,双炮叠叠将是中国象棋中很厉害的一招必杀技。炮吃子时必须隔一个棋子跳吃,即俗称"炮打隔子"。 
炮跟炮显然不能在一起打起来,于是rly一天借来了许多许多的炮在棋盘上摆了起来……他想知道,在N×M的矩形
方格中摆若干炮(可以不摆)使其互不吃到的情况下方案数有几种。
棋子都是相同的。

Input

一行,两个正整数N和M。
N<=100,M<=100

Output

一行,输出方案数mod 999983。

Sample Input

1 3

Sample Output

7

HINT

 

Source

[Submit][Status][Discuss]

 #include<cstdio>
#define N 105
#define P 999983
int n,m;long long f[N][N][N],ans;
inline long long C(int a,int b){
return b==?a:(1LL*a*(a-)/)%P;
}
main(){
scanf("%d%d",&n,&m),f[][m][]=;
for(int i=;i<n;++i)
for(int j=;j<=m;++j)
for(int k=;k<=m;++k)
if(f[i][j][k]){
(f[i+][j][k]+=f[i][j][k])%=P;
if(j>)(f[i+][j-][k+]+=f[i][j][k]*C(j,))%=P;
if(j>)(f[i+][j-][k+]+=f[i][j][k]*C(j,))%=P;
if(j>)(f[i+][j-][k]+=f[i][j][k]*C(j,)%P*C(k,))%=P;
if(k>)(f[i+][j][k-]+=f[i][j][k]*C(k,))%=P;
if(k>)(f[i+][j][k-]+=f[i][j][k]*C(k,))%=P;
}
for(int i=;i<=m;++i)
for(int j=;j<=m;++j)
ans=(ans+f[n][i][j])%P;
printf("%lld\n",ans);
}

4807: 車

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 126  Solved: 45
[Submit][Status][Discuss]

Description

众所周知,車是中国象棋中最厉害的一子之一,它能吃到同一行或同一列中的其他棋子。車跟車显然不能在一起打
起来,于是rly一天又借来了许多许多的車在棋盘上摆了起来……他想知道,在N×M的矩形方格中摆最多个数的車
使其互不吃到的情况下方案数有几种。但是,由于上次摆炮摆得实在太累,他为了偷懒,打算增加一个条件:对于
任何一个車A,如果有其他一个車B在它的上面(車B行号小于車A),那么車A必须在車B的右边(車A列号大于車B)
棋子都是相同的。

Input

一行,两个正整数N和M。
N<=1000000,M<=1000000

Output

一行,输出方案数的末尾50位(不足则直接输出)。
 

Sample Input

2 2

Sample Output

1

HINT

 

Source

[Submit][Status][Discuss]

 #include<cstdio>
#define N 1000005
int n,m,t,pri[N],que[N],cnt[N],ans[],tot=,mor;
void calc(int lim,int flg){
for(int i=;i<=lim;++i)
for(int num=i;num!=;)
cnt[pri[num]]+=flg,num/=pri[num];
}
main(){
scanf("%d%d",&n,&m);
if(n<m)n^=m^=n^=m;
for(int i=;i<=n;++i){
if(!pri[i])que[++t]=pri[i]=i;
for(int j=;j<=t&&i*que[j]<=n;++j){
pri[que[j]*i]=que[j];
if(!(i%que[j]))break;
}
}
ans[]=;
calc(n,+);
calc(m,-);
calc(n-m,-);
for(int i=;i<=t;++i)
for(int j=;j<=cnt[que[i]];++j){tot+=;
for(int k=;k<=tot;++k)ans[k]*=que[i];
for(int k=;k<=tot;++k)ans[k+]+=ans[k]/,ans[k]%=;
while(tot&&!ans[tot])--tot;if(tot>)tot=;
}
while(tot&&!ans[tot])--tot;
for(int i=tot;i;--i)putchar(''+ans[i]);
}

4808: 马

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 106  Solved: 43
[Submit][Status][Discuss]

Description

众所周知,马后炮是中国象棋中很厉害的一招必杀技。"马走日字"。本来,如果在要去的方向有别的棋子挡住(俗
称"蹩马腿"),则不允许走过去。为了简化问题,我们不考虑这一点。马跟马显然不能在一起打起来,于是rly在
一天再次借来了许多许多的马在棋盘上摆了起来……但这次,他实在没兴趣算方案数了,所以他只想知道在N×M的
矩形方格中摆马使其互不吃到的情况下的最多个数。但是,有一个很不幸的消息,rly由于玩得太Happy,质量本来
就不好的棋盘被rly弄坏了,不过幸好只是破了其中的一些格子(即不能再放子了),问题还是可以继续解决的。

Input

一行,两个正整数N和M。
接下来N行,每行M个数,要么为0,表示没坏,要么为1,表示坏了。
N<=200,M<=200

Output

一行,输出最多的个数。

Sample Input

2 3
0 1 0
0 1 0

Sample Output

2

HINT

 

Source

[Submit][Status][Discuss]

 #include <cstdio>

 template <class T>
inline T min(const T &a, const T &b)
{
return a < b ? a : b;
} inline int nextInt(void)
{
int r = ;
int f = ;
int c = getchar(); for (; c < ; c = getchar())
if (c == '-')f = ; for (; c > ; c = getchar())
r = r * + c - ; return f ? -r : r;
} const int mxn = ;
const int mxm = ;
const int inf = ; int s;
int t;
int tt;
int hd[mxn];
int nt[mxm];
int to[mxm];
int fl[mxm]; inline void add(int x, int y)
{
nt[tt] = hd[x], to[tt] = y, fl[tt] = , hd[x] = tt++;
nt[tt] = hd[y], to[tt] = x, fl[tt] = , hd[y] = tt++;
} int dep[mxn];
int que[mxn];
int cur[mxn]; inline bool bfs(void)
{
for (int i = s; i <= t; ++i)
dep[i] = ; int l = , r = ;
dep[s] = ;
que[] = s; while (l != r)
{
int u = que[l++], v; for (int i = hd[u]; ~i; i = nt[i])
if (v = to[i], !dep[v] && fl[i])
dep[que[r++] = v] = dep[u] + ;
} return dep[t];
} int dfs(int u, int f)
{
if (!f || u == t)
return f; int used = , flow, v; for (int &i = cur[u]; ~i; i = nt[i])
if (v = to[i], fl[i] && dep[v] == dep[u] + )
{
flow = dfs(v, min(f - used, fl[i])); used += flow;
fl[i] -= flow;
fl[i^] += flow; if (used == f)
return used;
} if (!used)
dep[u] = ; return used;
} inline int flow(void)
{
int ret = , tmp; while (bfs())
{
for (int i = s; i <= t; ++i)
cur[i] = hd[i]; while (tmp = dfs(s, inf))
ret += tmp;
} return ret;
} int n, m, id[][]; const int mov[][] =
{
{+, +},
{+, -},
{-, +},
{-, -},
{+, +},
{+, -},
{-, +},
{-, -}
}; signed main(void)
{
n = nextInt();
m = nextInt(); for (int i = ; i <= n; ++i)
for (int j = ; j <= m; ++j)
if (!nextInt())id[i][j] = ++t; ++t; for (int i = s; i <= t; ++i)
hd[i] = -; for (int i = ; i <= n; ++i)
for (int j = ; j <= m; ++j)
if (id[i][j])
{
if ((i ^ j) & )
add(s, id[i][j]);
else
add(id[i][j], t);
} for (int i = ; i <= n; ++i)
for (int j = ; j <= m; ++j)
if (((i ^ j) & ) && id[i][j])
for (int k = ; k < ; ++k)
{
int x = i + mov[k][];
int y = j + mov[k][]; if (x < || x > n)continue;
if (y < || y > m)continue; if (!id[x][y])continue; add(id[i][j], id[x][y]);
} printf("%d\n", t - - flow());
}

4809: 皇后

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 123  Solved: 62
[Submit][Status][Discuss]

Description

众所不知,rly现在不会玩国际象棋。但是,作为一个OIer,rly当然做过八皇后问题。这里再啰嗦几句,皇后可以攻击到同行同列同对角线,在n*n的方格中摆n个皇后使其互不攻击到,求不同的解的数量,这就是经典的n皇后问题。现在问题推广到n皇后问题,这个问题对于你而言实在是小菜一叠。但因为上一次rly把棋盘弄破了,又拿不出新的,所以rly打算难一点点,问题就是破棋盘上的n皇后问题。他想知道……(你们懂的)。
棋子都是相同的。

Input

一行,一个正整数N。
接下来N行,每行N个数,要么为0,表示没坏,要么1,表示坏了。
N<=16

Output

一行,输出不同的解的数量。

Sample Input

4
1 0 1 1
1 1 1 0
0 1 1 1
1 1 0 1

Sample Output

1

HINT

 

Source

[Submit][Status][Discuss]

 #include <cstdio>

 inline int nextInt(void)
{
int r = ;
int c = getchar(); for (; c < ; c = getchar());
for (; c > ; c = getchar())
r = r * + c - ; return r;
} const int mxn = ; typedef unsigned long long lnt; int n, ans, map[mxn][mxn]; void search(int x, lnt a, lnt b, lnt c)
{
if (x == n)++ans;
else
{
lnt d = a | b | c; for (register int y = ; y < n; ++y)
if (!map[x][y] && !((d >> y) & ))
search(x + ,
(a | (1ULL << y)),
(b | (1ULL << y)) >> ,
(c | (1ULL << y)) << );
}
} signed main(void)
{
n = nextInt(); for (int i = ; i < n; ++i)
for (int j = ; j < n; ++j)
map[i][j] = nextInt(); search(, , , ); printf("%d\n", ans);
}

@Author: YouSiki

BZOJ 4806 - 4809 象棋四题的更多相关文章

  1. Java-集合(没做出来)第四题 (List)写一个函数reverseList,该函数能够接受一个List,然后把该List 倒序排列。 例如: List list = new ArrayList(); list.add(“Hello”); list.add(“World”); list.add(“Learn”); //此时list 为Hello World Learn reverseL

    没做出来 第四题 (List)写一个函数reverseList,该函数能够接受一个List,然后把该List 倒序排列. 例如: List list = new ArrayList(); list.a ...

  2. 经典算法题每日演练——第十四题 Prim算法

    原文:经典算法题每日演练--第十四题 Prim算法 图论在数据结构中是非常有趣而复杂的,作为web码农的我,在实际开发中一直没有找到它的使用场景,不像树那样的频繁使用,不过还是准备 仔细的把图论全部过 ...

  3. NOIP2010-普及组复赛-第四题-三国游戏

    题目描述 Description 小涵很喜欢电脑游戏,这些天他正在玩一个叫做<三国>的游戏.  在游戏中,小涵和计算机各执一方,组建各自的军队进行对战.游戏中共有 N 位武将(N为偶数且不 ...

  4. CTF---Web入门第十四题 忘记密码了

    忘记密码了分值:20 来源: Justatest 难度:中 参与人数:7706人 Get Flag:2232人 答题人数:2386人 解题通过率:94% 找回密码 格式:SimCTF{ } 解题链接: ...

  5. hiho_offer收割18_题解报告_差第四题

    I.求逆元欧几里得方法 II.模拟细心+耐心 *本人感悟:自己的错误在于:对于这道模拟题没有耐心静下来一字一字看题,一行一行调错,一步一步调试,我要引以为戒. III.dpf[i][j][k]=max ...

  6. bzoj 3208 花神的秒题计划I

    bzoj 3208 花神的秒题计划I Description 背景[backboard]: Memphis等一群蒟蒻出题中,花神凑过来秒题-- 描述[discribe]: 花花山峰峦起伏,峰顶常年被雪 ...

  7. 第六届蓝桥杯java b组第四题

    第四题 两个整数做除法,有时会产生循环小数,其循环部分称为:循环节. 比如,11/13=6=>0.846153846153….. 其循环节为[846153] 共有6位. 下面的方法,可以求出循环 ...

  8. 网络流二十四题,题解summary

    没有全部写完,有几题以后再补吧. 第一题:最简单的:飞行员配对方案问题 讲讲这个题目为什么可以用网络流? 因为这个题目是要进行两两之间的匹配,这个就可以想到用二分图匹配,二分图匹配又可以用网络流写. ...

  9. bzoj usaco 金组水题题解(2.5)

    bzoj 2197: [Usaco2011 Mar]Tree Decoration 树形dp..f[i]表示处理完以i为根的子树的最小时间. 因为一个点上可以挂无数个,所以在点i上挂东西的单位花费就是 ...

随机推荐

  1. Python 学习 第四篇:动态类型模型

    Python的变量不用声明,赋值之后就可以直接使用,类型是在运行过程中自动确定的,这就是动态类型模型.该模型把变量和对象设计成两个不同的实体,对象是存储数据的地方,对象的类型是由初始值自动决定的,而变 ...

  2. 过渡与动画 - 缓动效果&基于贝塞尔曲线的调速函数

    难题 给过渡和动画加上缓动效果是一种常见的手法(比如具有回弹效果的过渡过程)是一种流行的表现手法,可以让界面显得更加生动和真实:在现实世界中,物体A点到B点往往也是不完全匀速的 以纯技术的角度来看,回 ...

  3. mysqldump数据导出问题和客户端授权后连接失败问题

    1,使用mysqldump时报错(1064),这个是因为mysqldump版本太低与当前数据库版本不一致导致的.mysqldump: Couldn't execute 'SET OPTION SQL_ ...

  4. Vuex实现原理解析

    我们在使用Vue.js开发复杂的应用时,经常会遇到多个组件共享同一个状态,亦或是多个组件会去更新同一个状态,在应用代码量较少的时候,我们可以组件间通信去维护修改数据,或者是通过事件总线来进行数据的传递 ...

  5. E. Train Hard, Win Easy

    链接 [http://codeforces.com/contest/1043/problem/E] 题意 有n个人,每个人都有做出a,b题的分数,xi,yi,但是有些人是不能组队的,问你每个人和其他能 ...

  6. c++入门之关于cin,cout以及数据流的认识

  7. oracle数据库添加新用户

    /*分为四步 */ /*第1步:创建临时表空间 */ create temporary tablespace kmyf_temp tempfile 'E:\app\pangxy\product\11. ...

  8. 《Linux内核分析》第八周学习笔记

    <Linux内核分析>第八周学习笔记 进程的切换和系统的一般执行过程 郭垚 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163 ...

  9. springboot整合fastJson遇到重定向问题

    通过网上教程使用springboot整合fastJson后遇到页面重定向问题(使用的springboot版本是2.0.2.RELEASE ,其他的版本可能不会出现以下问题),如下图: 我的项目结构如下 ...

  10. Spring使用Cache、整合Ehcache(转)

    今天在做Spring使用Cache.整合Ehcache时发现一篇非常好的文章,原文地址 http://elim.iteye.com/blog/2123030 从3.1开始,Spring引入了对Cach ...