原题链接

题目大意:

有来自三个地区的人各a,b,c位,他们排成了一排。请问有多少种不同类型的排法,使得相邻的人都来自不同的地区
\(a,b,c<=200\)
答案取模

题解

弱弱的标程解法

设\(f[i][j][k][l]\)表示三种人各排了\(i\)、\(j\)、\(k\)个,最后一个人是l类
那么转移就很显然了,枚举下一个非\(l\)人即可

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 205,P = 2001611;
int f[maxn][maxn][maxn][3],a,b,c;
int main(){scanf("%d%d%d",&a,&b,&c);f[1][0][0][0] = f[0][1][0][1] = f[0][0][1][2] = 1;for (int i = 0; i <= a; i++)for (int j = 0; j <= b; j++)for (int k = 0; k <= c; k++)for (int l = 0; l <= 2; l++){if (i < a && l != 0)f[i + 1][j][k][0] = (f[i + 1][j][k][0] + f[i][j][k][l] * (i + 1) % P) % P;if (j < b && l != 1)f[i][j + 1][k][1] = (f[i][j + 1][k][1] + f[i][j][k][l] * (j + 1) % P) % P;if (k < c && l != 2)f[i][j][k + 1][2] = (f[i][j][k + 1][2] + f[i][j][k][l] * (k + 1) % P) % P;}printf("%d\n",(f[a][b][c][0] + f[a][b][c][1] + f[a][b][c][2]) % P);return 0;
}

更优秀的解法

std解法考虑往队尾插人,需要设置四维状态
我们考虑只设置三维状态,运用记忆化搜索

同样设\(f[i][j][k]\)表示三种人各排了\(i\)、\(j\)、\(k\)个
可以发现三种人是等价的,人数互换不影响结果
所以我们只考虑\(i <= j <= k\)

转移时,为使状态最终能转移至初始状态,我们考虑人数最多的\(k\)
我们在最后合法的队形中抽出\(k\)中的一个人,会出现两种情况:
①最后的队列还是一个合法队列
②最后的队列不合法,而且仅有原来抽出的位置有两个相同的人相邻

那么就可以转移了
①如果合法,就有\(f[i][j][k - 1]\)中队形,其中有\(i + j - k + 2\)个可插入位置,总共有\(f[i][j][k - 1] * (i + j - k + 2)\)种方案
②如果不合法,要么是\(i\)相邻,要么是\(j\)相邻,
以\(i\)相邻为例,我们如果把相邻的两个人看做一个人,那么这个状态就又是合法的了,有\(f[i - 1][j][k]\)种方案,而\(i\)中任意选两个人有序组合,有\(P_{i}^{2}\)中方案,故对\(i\)总共有\(f[i - 1][j][k - 1] * P_{i}^{2}\)中方案

\(j\)类似

考虑边界,当出现0时,
①两个0,即只剩一种人了,当且仅当人数为1时方案数为1,否则为0
②一个0,即剩余两种人,如果两种人人数只差超过了1,方案数为0,否则两种人之间的位置关系一定是交替的,用排列数计算即可

具体实现参考代码

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#define LL long long int
#define Redge(u) for (int k = h[u],to; k; k = ed[k].nxt)
#define REP(i,n) for (int i = 1; i <= (n); i++)
#define BUG(s,n) for (int i = 1; i <= (n); i++) cout<<s[i]<<' '; puts("");
using namespace std;
const int maxn = 205,maxm = 100005,INF = 1000000000,P = 2001611;
LL f[maxn][maxn][maxn],fac[maxn];
bool vis[maxn][maxn][maxn];
void order(LL& x,LL& y,LL& z){if (x > y) swap(x,y); if (x > z) swap(x,z); if (y > z) swap(y,z);
}
LL F(LL x,LL y,LL z){order(x,y,z);if (vis[x][y][z]) return f[x][y][z];  //记忆化vis[x][y][z] = true;LL& ff = f[x][y][z];if (y == 0) return ff = (z == 1);       //边界if (x == 0){if (z == y) return ff = fac[z] * fac[y] % P * 2 % P;if (abs(z - y) == 1) return ff = fac[z] * fac[y] % P;return 0;}return ff = (F(x,y,z - 1) * (x + y - z + 2) % P + x * (x - 1) % P * F(x - 1,y,z - 1) % P + y * (y - 1) % P * F(x,y - 1,z - 1) % P) % P;
}
int main(){fac[0] = 1;for (int i = 1; i <= 200; i++) fac[i] = fac[i - 1] * i % P;  //预处理阶乘LL a,b,c;scanf("%lld%lld%lld",&a,&b,&c);printf("%lld\n",F(a,b,c));return 0;
}

转载于:https://www.cnblogs.com/Mychael/p/8574906.html

Mychael原创题 洛谷T23923 Mychaelの水题 【题解】相关推荐

  1. [洛谷P4626]一道水题 II

    题目大意:求$lcm(1,2,3,\cdots,n)\pmod{100000007}$,$n\leqslant10^8$ 题解:先线性筛出质数,然后求每个质数最多出现的次数,可以用$\log_in$来 ...

  2. 洛谷 P2791 幼儿园篮球题

    洛谷 P2791 幼儿园篮球题 https://www.luogu.org/problemnew/show/P2791 我喜欢唱♂跳♂rap♂篮球 要求的是:\(\sum_{i=0}^kC_m^iC_ ...

  3. 洛谷P1129 [ZJOI2007] 矩阵游戏 题解

    洛谷P1129 [ZJOI2007] 矩阵游戏 题解 题目链接:P1129 [ZJOI2007] 矩阵游戏 题意:给定一张有黑白棋子的正方形棋盘,问存不存在解法使得经过若干次交换行或列的操作后,左上角 ...

  4. 【NOIP2018】旅行 (洛谷P5049 / P5022) O(nlogn)题解

    阅读和学习本篇题解前,你应该掌握: C++ STL stack.vector.queue.pair的基本用法: 递归.搜索和贪心思想. 洛谷传送门 P5049 此题可以先从数据范围入手,观察m的范围( ...

  5. 洛谷P3647 [APIO2014] 连珠线 题解

    洛谷P3647 [APIO2014] 连珠线 题解 题目链接:P3647 [APIO2014] 连珠线 题意: 在达芬奇时代,有一个流行的儿童游戏称为连珠线.当然,这个游戏是关于珠子和线的.线是红色或 ...

  6. 洛谷P1462 通往奥格瑞玛的道路 题解

    洛谷P1462 通往奥格瑞玛的道路 题解 题目链接:P1462 通往奥格瑞玛的道路 题意:在艾泽拉斯,有 nnn 个城市.编号为 1,2,3,-,n1,2,3,\ldots,n1,2,3,-,n . ...

  7. 洛谷P3879 [TJOI2010] 阅读理解 题解

    洛谷P3879 [TJOI2010] 阅读理解 题解 题目链接:P3879 [TJOI2010] 阅读理解 题意: 英语老师留了 NNN 篇阅读理解作业,但是每篇英文短文都有很多生词需要查字典,为了节 ...

  8. 洛谷P4037 [JSOI2008]魔兽地图 题解

    洛谷P4037 [JSOI2008]魔兽地图 题解 题目链接:P4037 [JSOI2008]魔兽地图 题意: DotR (Defense of the Robots) Allstars是一个风靡全球 ...

  9. 洛谷P3336 [ZJOI2013]话旧 题解

    洛谷P3336 [ZJOI2013]话旧 题解 题目链接:P3336 [ZJOI2013]话旧 题意:小林跟着银河队选手去了一趟宇宙比赛,耳濡目染,变得学术起来.回来后,他发现世界大变样了.比丘兽究级 ...

  10. 洛谷P4683 [IOI2008] Type Printer 题解

    洛谷P4683 [IOI2008] Type Printer 题解 题目链接:P4683 [IOI2008] Type Printer 题意: 你需要利用一台可移动的打印机打印出NNN个单词.这种可移 ...

最新文章

  1. 2020春招即将来袭,送你110道Python面试真题
  2. 【AWS】AWS云计算赋能数字化转型专题研讨会圆满落幕
  3. ORA-29275:部分多字节字符
  4. mxnet基础到提高(44)-ndarray.arange创建行向量
  5. 服务器内存傲腾基本参数信息,服务器加傲腾内存
  6. pythonspark实例_spark+python快速入门实战小例子(PySpark)
  7. java map key 大写转小写_Spring JdbcTemplate 查询出的Map,是如何产生大小写忽略的Key的?(转)...
  8. 微纪实 | 人工智能产业落地最真实的样子
  9. Java HashMap 默认排序
  10. 北航机试 16逆序数
  11. FFmpeg: mac下手动编译android上使用的FFmpeg(支持x86、armeabi-v7a、arm64-v8a)
  12. 笔记本计算机风扇声音大怎么办,教你怎么从解决笔记本风扇狂转、噪音过大!-电脑风扇声音大怎么办...
  13. Java_实现身份证信息提取个人信息
  14. Freemarker 简介 及手册
  15. android蓝牙配对 自动联接,如何实现android蓝牙开发 自动配对连接,并不弹出提示框...
  16. 梦幻跨服购买需要登录服务器未响应,《梦幻西游》手游跨服交易有什么是需要注意的_ 《梦幻西游》手游官网-人人都玩,无处不在...
  17. Tensorflow2.3用SaveModel保存训练模型.pb等文件+opencvino转IR文件
  18. 计算机专业英语简介模板,计算机专业英文简历模版
  19. 小学计算机flash,小学信息技术第五册  9.初识flash软件
  20. hbase周学习——赵俊杰

热门文章

  1. Hive map阶段缓慢,优化过程详细分析
  2. Ioc容器beanDefinition-Spring 源码系列(1)
  3. 【Spring】Spring常用配置-Bean的初始化和销毁(生命周期)
  4. java 小程序--杨辉三角
  5. 【HDU 4925】BUPT 2015 newbie practice #2 div2-C-HDU 4925 Apple Tree
  6. Sublime Text 3运行JavaScript控制台
  7. mysql 查看死锁和去除死锁
  8. Extjs layout 总结
  9. Hibernate 入门
  10. table内容保存到Excel中