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. asp.net网站,在没有项目源码情况下的扩展

    如果在没有源码的情况下,要扩展asp.net网站,可以自己新增一个类库项目,在里面添加需要扩展的类,代码如下: using System; using System.Collections.Gener ...

  2. ASPCMS_判断语句if标签的使用

    这几天在仿个企业站,又用到了ASPCMS.这个CMS系统支持响应式模板——视访问设备而使用不同的模板,这样PC.手机都能兼顾. ▼官方给出的说明: 1.满足条件则显示 {if:条件语句} 显示内容 { ...

  3. git 配置别名

    对于常用的git的命令,可以通过配置别名的方式,提高工作效率. $ git config --global alias.co checkout //执行git co 相当于git checkout $ ...

  4. linux-IO重定向-文本流重定向

    输出重定向的追加和覆盖 标准输出就这两种: 覆盖和追加 >> 是重定向操作符 1 是 命令的文件描述符 重定向操作符合文件描述符之间不能存在空白符 否则1会被当做是文件被读取 将正确和错误 ...

  5. python-编码-15

    ascii A : 00000010 8位 一个字节 unicode A : 00000000 00000001 00000010 00000100 32位 四个字节 中:00000000 00000 ...

  6. 移动app rem

    (function (doc, win) { var docEl = doc.documentElement, resizeEvt = 'orientationchange' in window ? ...

  7. Eddy's mistakes HDU

    链接 [http://acm.hdu.edu.cn/showproblem.php?pid=1161] 题意 把字符串中大写字母变为小写 . 分析 主要是含有空格的字符串如何读入,用getline(c ...

  8. 第三个Sprint冲刺第6天

    成员:罗凯旋.罗林杰.吴伟锋.黎文衷

  9. 第三个spring冲刺总结(附团队贡献分)

    基于调查需求下完成的四则运算,我们完成了主要的3大功能. 第一,普通的填空题运算,这个是传统的运算练习方式,团队都认为这个选项是必要的,好的传统要留下来,在个人经历中,填空练习是一个不错的选择. 第二 ...

  10. SpringMvc配置扫包之后,访问路径404问题解决

    场景: 1. 配置了Spring和SpringMvc, Spring管理非Controller类的Bean, SpringMvc管理涉及的Controller类 2. web.xml已经配置了Spri ...