【问题描述】

【题解】

先考虑一个最简单的情况。如一个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. Mongodb总结3-稍微封装一下

    上次发表的2,纯粹是Demo,演示API的用法. 今天,稍微封装了下,看得更清楚. 考虑到不容易做得很有通用性,所以封装的一般,换种场景需要直接修改代码,但是有一部分是可以复用的. 最近项目,很可能只 ...

  2. 黑马day01 xml 的解析方式

    XML编程:利用java程序去增删改查(CRUD)xml中的数据 解析思想: dom解析 sax解析 基于这两种解析思想市面上就有了非常多的解析api sun jaxp既有dom方式也有sax方式,而 ...

  3. 哈夫曼树的介绍 ---java实现

    一.     什么是哈夫曼树 是一种带权路径长度最短的二叉树,也称最优二叉树 带权路径长度:WPL=(W1*L1+W2*L2+W3*L3+...+ Wn*Ln) N个权值Wi(i=1,2,...n)构 ...

  4. Kaggle实战分类问题2

    Kaggle实战之二分类问题 0. 前言 1. MNIST 数据集 2. 二分类器 3. 效果评测 4. 多分类器与误差分析 5. Kaggle 实战 0. 前言 “尽管新技术新算法层出不穷,但是掌握 ...

  5. H5移动端IOS/Android兼容性总结,持续更新中…

    H5移动端IOS/Android兼容性总结,持续更新中… 1. IOS不识别日期 new Date("2018-07-01 08:00:00")在Android下正常显示可以直接进 ...

  6. C++的模板template

    模板是C++支持参数化多态的工具,使用模板可以使用户为类或者函数声明一种一般模式,使得类中的某些数据成员或者成员函数的参数.返回值取得任意类型. 模板是一种对类型进行参数化的工具: 因此,使用模板的目 ...

  7. Javascript和jquery事件--鼠标移动事件mousemove

    mousemove,一个监听元素上鼠标移动的事件,如果鼠标在元素上移动,大概每16毫秒触发一次.我觉得挺有趣的一个元素,不过有替代还是不太推荐,从这个事件的触发频率就可以看出它会拖慢响应速度,消耗资源 ...

  8. postman--基本使用2

    本文转自:http://blog.csdn.net/u013613428/article/details/51557804 最近需要测试产品中的REST API,无意中发现了PostMan这个chro ...

  9. 折腾了我两天的springboot数据源datasource循环依赖问题,都被搞疯掉了

    在做项目重构的时候增加了两个功能 1.多数据源. 2.token的验证从以前的数据库验证,移到了redis端. 1.多数据源使用 druid-spring-boot-starter 套件 其核心代码如 ...

  10. Android原生生成JSON与解析JSON

    JSON数据是一种轻量级的数据交换格式,在Android中通常应用于client与server交互之间的传输数据.像如今在网上有非常多解析JSON数据的jar包,可是归根究竟用的都是Android原生 ...