【问题描述】

【题解】

先考虑一个最简单的情况。如一个n*n的棋盘。然后要放k个车。

我们可以先选出k行即C(n,k);

然后在列上对这k个棋子进行一次全排列即A(n,k);

比如k = 4;N=5

选的行为1,2,3,4

然后枚举的列1,2,3,4和4,3,2,1

前者表示第一行放在1,第二行放在2,。。。第4行放在4.(列)

后者表示第一行放在4,第二行放在3.。。。第4行放在1的位置.(列)

这是进行全排列的原因。

然后答案就是C(n,k)*A(n,k);

然后把原题的图切成下面的样子

然后在上面的小矩形内枚举放置i个棋子。

方案就是C(b,i)*A(a,i);

在下面。因为左边被占据了i列。所以下面可以用的只剩下a+c-i列。

可以看成是一个长为a+c-i,宽为d的矩形。

则在下面的方案为C(d,k-i)*A(a+c-i,k-i);

然后对于枚举的i,如果可行。则答案递增C(b,i)*A(a,i)*C(d,k-i)*A(a+c-i,k-i)

要记得取模。

然后组合数可以用C[i][j] = c[i-1][j]+c[i-1][j-1]得到。

然后因为

所以要求排列数可以用组合数乘上一个k!

一边取模就可以了。

然后因为C(b,i)*A(a,i)*C(d,k-i)*A(a+c-i,k-i) 中出现了a+c-i。所以把组合数开到[2000][2000]

不然会错!而且编译器不会告诉你数组越界了!

还有一种分法。

则对于枚举的i变成递增答案C(d,i)*A(c,i)+C(b+d-i,k-i)*A(a,k-i);

【代码】--按照第一种分法做的。

#include <cstdio>
#include <stdlib.h> const int mo = 100003;
long long A[2001][2001], C[2001][2001], N1[2001], ans = 0; //乘的时候可能会超过int类型所以用Longlong了。
int a, b, c, d, k; void init()
{
for (int i = 0; i <= 2000; i++) //获取组合数
C[i][0] = 1, C[i][i] = 1;
for (int i = 1; i <= 2000; i++)
for (int j = 1; j <= i; j++)
C[i][j] = (C[i - 1][j] + C[i - 1][j - 1]) % mo;
N1[0] = 1;
for (int i = 1; i <= 2000; i++) //获取1到2000的阶乘,当然都是取模后的结果。
N1[i] = (N1[i - 1] * i) % mo;
for (int i = 0; i <= 2000; i++) //用相应的组合数来获取排列数。
for (int j = 0; j <= i; j++)
A[i][j] = (C[i][j] * N1[j]) % mo;
} int min(int a, int b) //返回a和b中的较小值。
{
return a>b ? b : a;
} void input_data()
{
scanf("%d%d%d%d%d", &a, &b, &c, &d, &k);//输入数据
int maxk = min(a, b); //这是在上面那个小矩形内能够放下的最大的车的数量
for (int i = 0; i <= maxk; i++) //枚举在那个小矩形内放几个车
{
if ((k - i) > d) continue;
if ((a + c - i)<(k - i)) continue; //如果下面的大矩形不能放下剩余的k-i个车则跳过
ans = (ans + ((((C[b][i] * A[a][i]) % mo)*((C[d][k - i] * A[a + c - i][k - i]) % mo)) % mo)) % mo;
//否则按照题解的思路递增答案。
}
} void output_ans()
{
printf("%I64d", ans);
} int main()
{
//freopen("F:\\rush.txt","r",stdin);
//freopen("F:\\rush_out.txt", "w", stdout);
//freopen("place.in","r",stdin);
//freopen("place.out","w",stdout);
init();
input_data();
output_ans();
//fclose(stdin);
// fclose(stdout);
return 0;
}

【u022】车的放置的更多相关文章

  1. P1350 车的放置

    P1350 车的放置 设$f[i][j]$为当前推到第$i$列,该列高度$h$,已经放了$j$个车的方案数 则$f[i][j]=f[i-1][j]+f[i-1][j-1]*(h-j+1)$ 但是我们发 ...

  2. 洛谷 P1350 车的放置

    洛谷 P1350 车的放置 题目描述 有下面这样的一个网格棋盘,a,b,c,d表示了对应边长度,也就是对应格子数. 当a=b=c=d=2时,对应下面这样一个棋盘 要在这个棋盘上放K个相互不攻击的车,也 ...

  3. 【CH6802】车的放置

    题目大意:给定一个 N*M 的棋盘,棋盘上有些点不能放置任何东西,现在在棋盘上放置一些车,问最多可以放置多少个车而不会互相攻击. 题解:将放置一个车看作连接一条无向边,因为每一行和每一列之间只能放置一 ...

  4. 【题解】洛谷P1350 车的放置(矩阵公式推导)

    洛谷P1350:https://www.luogu.org/problemnew/show/P1350 思路 把矩阵分为上下两块N与M 放在N中的有i辆车 则放在M中有k-i辆车 N的长为a   宽为 ...

  5. hdu1281(棋盘游戏,车的放置)

    Problem Description 给定一个n * m的棋盘,在棋盘里放尽量多的国际象棋中的车,使他们不能相互攻击 已知有些格子不能放置,问最多能放置多少个车 并计算出必须棋盘上的必须点. Inp ...

  6. loj题目总览

    --DavidJing提供技术支持 现将今年7月份之前必须刷完的题目列举 完成度[23/34] [178/250] 第 1 章 贪心算法 √ [11/11] #10000 「一本通 1.1 例 1」活 ...

  7. XVIII Open Cup named after E.V. Pankratiev. GP of Romania

    A. Balance 不难发现确定第一行第一列后即可确定全部,列不等式单纯形求解线性规划即可. #include<cstdio> #include<algorithm> usi ...

  8. YBT 6 数学基础

    $补+写题ing$ 第 1 章 快速幂 序列的第 k 个数 link $solution:$ 板子 A 的 B 次方 link $solution:$ 板子 [NOIP2013] 转圈游戏 link ...

  9. CSU训练分类

    √√第一部分 基础算法(#10023 除外) 第 1 章 贪心算法 √√#10000 「一本通 1.1 例 1」活动安排 √√#10001 「一本通 1.1 例 2」种树 √√#10002 「一本通 ...

随机推荐

  1. 老调重弹:JDBC系列 之 &lt;驱动载入原理全面解析&gt;

    前言 近期在研究Mybatis框架,因为该框架基于JDBC.想要非常好地理解和学习Mybatis,必需要对JDBC有较深入的了解.所以便把JDBC 这个东东翻出来.好好总结一番,作为自己的笔记,也是给 ...

  2. 5. Spring Boot 拦截器

    转自:https://blog.csdn.net/catoop/article/details/50501696

  3. 1.14 Python基础知识 - 文件操作

    应用程序往往需要从磁盘文件中读取数据,或者把数据存储到磁盘中文件里,以持久的保存数据.文件可以看作是数据的集合,文件的输入与输出通过流来实现.流有5种基本的操作:打开.读取.写入.改变当前位置和关闭. ...

  4. JS/CSS 响应式样式实例

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  5. Flask项目之手机端租房网站的实战开发(三)

    说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 接着上一篇博客继续往下写 :https://blog.csdn.net/qq_41782425/article/details/8 ...

  6. ClickOnce

    Clic WPF ClickOnce应用程序IIS部署发布攻略   WPF程序非常适合公司内网使用,唯一缺点就是客户端要安装.net框架4.0.优势也很明显,在客户端运行的是一个WinForm程序,自 ...

  7. sass和less,优秀的前端样式预处理器

    身为切图界的一员,或者说在前端界打滚了一段日子的你.会慢慢地发现.如今的css编写已经不能满足自己的效率. 假设有更强大的框架,让你的css更灵活和更easy复用和维护,那该多好啊.非常明显,这个早已 ...

  8. Android ListView带CheckBox实现单选

    第1种方法: 首先是我们的bean: public class Bean { private boolean isChecked; private String msg = "这是一条测试数 ...

  9. 高效的敏感词过滤方法(PHP)

    方法一: ? 1 2 3 4 5 6 7 $badword = array(      '张三','张三丰','张三丰田'  );  $badword1 = array_combine($badwor ...

  10. ImageView的圆角半径

    // 设置imageview的圆角半径 UIImageView *imageView = (UIImageView *)[cell viewWithTag:tag]; imageView.layer. ...