Written with StackEdit.

Description

大家应该都见过很多人手拉手围着篝火跳舞的场景吧?一般情况下,大家手

拉手跳舞总是会围成一个大圈,每个人的左手拉着旁边朋友的右手,右手拉着另一侧朋友的左手。

不过,如果每一个人都随机的拉住两个不同人的手,然后再慢慢散开,事情

就变得有趣多了——此时大家依旧会形成圈,不过却可能会形成多个独立的圈。

当然这里我们依然要求一个人的右手只能拉另一个人的左手,反之亦然。

班里一共有\(N\)个同学,由\(1\)到\(N\)编号。\(Will\)想知道,究竟有多少种本质不同的拉手方案,使得最终大家散开后恰好形成\(k\)个圈呢?

给定两种方案,若存在一个人和他的一只手,满足在这两种方案中,拉着这只手的人的编号不同,则这两种方案本质不同。

Input

输入一行包含三个正整数\(N\),\(k\)和\(P\).

\(3<=3k<=N<=3000,10^4<=p<=2×10^9.\)

Output

输出文件的包含一行一个整数,表示本质不同的方案数对\(p\)的余数。保证\(p\)一定是一个质数。

Sample Input

3 1 1000000009

Sample Output

2

Solution

  • 这类游戏的套路其实都大同小异...考虑最后一个人的情况\(dp\)即可.
  • 就此题而言,设\(f[i][j]\)表示\(i\)个人形成\(j\)个环的方案数目.
  • 考虑最后一个人,他可以插入到前面已经有的环里,不形成新的环.
  • 前面\(i-1\)个人有\(i-1\)个位置可以插入.
  • 方案数为\(f[i-1][j]*(i-1)\).
  • 他也可以形成一个新的环,从前面的\(i-1\)个人中选择\(2\)个人和他成环,而这两人在他左右交换算作两次.
  • 方案数为\(f[i-3][j-1]*C_{i-1}^2*2.\)
  • 需要注意边界条件,显然有\(f[0][0]=1\),还需要注意的是当\(j<\lfloor i/3 \rfloor\)时,因为至少要三个人组成一个环,这种情况的方案数也为\(0\).
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long LoveLive;
  4. inline int read()
  5. {
  6. int out=0,fh=1;
  7. char jp=getchar();
  8. while ((jp>'9'||jp<'0')&&jp!='-')
  9. jp=getchar();
  10. if (jp=='-')
  11. {
  12. fh=-1;
  13. jp=getchar();
  14. }
  15. while (jp>='0'&&jp<='9')
  16. {
  17. out=out*10+jp-'0';
  18. jp=getchar();
  19. }
  20. return out*fh;
  21. }
  22. int n,k,P;
  23. inline int add(int a,int b)
  24. {
  25. return (1LL*a + 1LL*b) % P;
  26. }
  27. inline int mul(int a,int b)
  28. {
  29. return 1LL * a * b % P;
  30. }
  31. inline int swapC(int x)
  32. {
  33. return mul(x,x-1);
  34. }
  35. const int MAXN=3e3+110;
  36. int f[MAXN][MAXN];
  37. int dp(int i,int j)
  38. {
  39. if(f[i][j]!=-1)
  40. return f[i][j];
  41. if(i==0 && j==0)
  42. return 0;
  43. if(j>(i/3))//注意边界
  44. return 0;
  45. int &res=f[i][j];
  46. res=0;
  47. res=add(res,mul(dp(i-1,j),i-1));
  48. res=add(res,mul(dp(i-3,j-1),swapC(i-1)));
  49. return res;
  50. }
  51. int main()
  52. {
  53. n=read(),k=read(),P=read();
  54. for(int i=0;i<=n;++i)
  55. for(int j=0;j<=k;++j)
  56. f[i][j]=-1;
  57. int ans=dp(n,k);
  58. printf("%d\n",ans);
  59. return 0;
  60. }

bzoj 4465 游戏中的学问的更多相关文章

  1. bzoj 4465 游戏中的学问(game)

    题目描述 输入 输出 样例输入 3 1 1000000009 样例输出 2 提示 solution 令f[i][j]表示i个人围成j个圈的方案数 啥意思呢 可以把一个人塞进前面的圈里(i-1种塞法) ...

  2. bzoj 4465: [Jsoi2013]游戏中的学问

    4465: [Jsoi2013]游戏中的学问 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 121  Solved: 59[Submit][Statu ...

  3. 「JSOI2013」游戏中的学问

    「JSOI2013」游戏中的学问 传送门 考虑 \(\text{DP}\) 设 \(dp_{i, j}\) 表示将前 \(i\) 个人分成 \(j\) 个集合,并且第 \(i\) 个人在第 \(j\) ...

  4. 【题解】4465 [Jsoi2013]游戏中的学问

    原题传送门 线性dp推一推就推出方程 设\(f[i][j]\)表示有\(j\)个人,分成\(i\)组,一共有多少分发 边界为\(f[0][0]=1\),珂以得出方程为\(f[i][j]=(j-1)*( ...

  5. bzoj4465: [Jsoi2013]游戏中的学问

    DP 一个人要么加入一个圈,要么三个人开一圈 #include<cstdio> #include<iostream> #include<cstring> #incl ...

  6. 地图四叉树一般用在GIS中,在游戏寻路中2D游戏中一般用2维数组就够了

    地图四叉树一般用在GIS中,在游戏寻路中2D游戏中一般用2维数组就够了 四叉树对于区域查询,效率比较高. 原理图

  7. FPS中受伤UI在VR游戏中的实现思路

    FPS中受伤UI在VR游戏中的实现思路 希望实现的效果 这几天一直在尝试各种解决方案,现在算是不完美的解决啦,记录一下心路历程,思路有了算法都比较简单. V_1 玩家胶囊体指向的方向作为正方向,计算出 ...

  8. 游戏中的人工智能——初探AI

    一.游戏中的人工智能 让游戏具有挑战性: 让游戏好玩的关键因素是为之找到合适的难度等级: 人工智能在游戏中的作用是通过提供富有挑战性的竞争对象来让游戏更好玩,而在游戏中行动逼真的非玩家角色(NPC), ...

  9. 【腾讯GAD暑期训练营游戏程序开发】游戏中的动画系统作业

    游戏中的动画系统作业说明文档   一.实现一个动画状态机:至少包含3组大的状态节点

随机推荐

  1. SQL生成一串随机数

    SELECT RIGHT (CONVERT(VARCHAR(20),CONVERT(DECIMAL(20,15),rand())),15) AS c_random_number

  2. CF960G(第一类斯特林数)

    题目 CF960G 做法 设\(f(i,j)\)为\(i\)个数的序列,有\(j\)个前缀最大值的方案数 我们考虑每次添一个最小数,则有:\(f(i,j)=f(i-1,j)+(i-1)*f(i-1,j ...

  3. Java多线程基础知识总结笔记

    本篇笔记记录一些在Java多线程编程中常见的关键字,比较简单和基础的就不写太详细了. 一.Thread类(其实也是应用了Runnable接口)和Runnable接口(只有一个run方法,应用该类必须重 ...

  4. Oracle数据库的数据导入导出

    --备份数据库--数据库系统用户账号system/adminuser --查看oracle数据库的用户select * from all_users;--查看oracle数据库的版本号select * ...

  5. React Native实战系列教程之自定义原生UI组件和VideoView视频播放器开发

    React Native实战系列教程之自定义原生UI组件和VideoView视频播放器开发   2016/09/23 |  React Native技术文章 |  Sky丶清|  4 条评论 |  1 ...

  6. 采用DoGet方式提交中文,乱码产生原因分析及解决办法

    前段时间某功能在测试机器上出现乱码,情况如下:   现象:           调试搜索功能时,通过doGet方法提交到后台的中文参数在本地和开发测试机器上为乱码(Action层),在测试人员测试机器 ...

  7. 并发-Synchronized底层优化(偏向锁、轻量级锁)

    Synchronized底层优化(偏向锁.轻量级锁) 参考: http://www.cnblogs.com/paddix/p/5405678.html 一.重量级锁 上篇文章中向大家介绍了Synchr ...

  8. 《Computational Statistics with Matlab》硬译2

    T=; sigma=; thetamin=-;thetamax=; theta=zeros(,T); seed=;rand('state',seed);randn('state',seed); the ...

  9. scala学习手记14 - 单例对象

    java中的单例模式都很熟悉了:简单地说就是一个类只能有一个实例.在scala中创建单例对象非常简单,创建类时使用object关键字替换class即可.因为单例类无法初始化,所以不能向它的主构造函数传 ...

  10. ECS vs. Kubernetes 类似而又不同

    C2Container Service (ECS)和Kubernetes (K8s) 都解决了同样的问题:跨越主机集群管理容器.ECS和Kubernetes之间的斗争让我想起了vi和Emacs之间的编 ...