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\).
#include<bits/stdc++.h>
using namespace std;
typedef long long LoveLive;
inline int read()
{
int out=0,fh=1;
char jp=getchar();
while ((jp>'9'||jp<'0')&&jp!='-')
jp=getchar();
if (jp=='-')
{
fh=-1;
jp=getchar();
}
while (jp>='0'&&jp<='9')
{
out=out*10+jp-'0';
jp=getchar();
}
return out*fh;
}
int n,k,P;
inline int add(int a,int b)
{
return (1LL*a + 1LL*b) % P;
}
inline int mul(int a,int b)
{
return 1LL * a * b % P;
}
inline int swapC(int x)
{
return mul(x,x-1);
}
const int MAXN=3e3+110;
int f[MAXN][MAXN];
int dp(int i,int j)
{
if(f[i][j]!=-1)
return f[i][j];
if(i==0 && j==0)
return 0;
if(j>(i/3))//注意边界
return 0;
int &res=f[i][j];
res=0;
res=add(res,mul(dp(i-1,j),i-1));
res=add(res,mul(dp(i-3,j-1),swapC(i-1)));
return res;
}
int main()
{
n=read(),k=read(),P=read();
for(int i=0;i<=n;++i)
for(int j=0;j<=k;++j)
f[i][j]=-1;
int ans=dp(n,k);
printf("%d\n",ans);
return 0;
}

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. NIO复习03

    SocketChannel: 1. Java NIO中的SocketChannel是一个连接到TCP网络套接字的通道.可以通过以下2种方式创建SocketChannel: 打开一个SocketChan ...

  2. 安装pycurl

    环境:ubuntu 1604 安装 pycurl 遇到一些问题 简单记录 1.安装 pippython2:apt install python-pippython3: apt install pyth ...

  3. Tomcat:解决Tomcat可以在eclipse启动,却无法显示默认页面的操作

    解决Tomcat可以在eclipse启动,却无法显示默认页面的操作 今天在eclipse中配置好tomcat后访问不到它的主页,但是能运行自己的项目,一直找不到原因,百度之后最后解决了这个问题,总结如 ...

  4. Centos6.5安装python2.7与pip

    安装Python2.7 安装环境 [root@localhost1 ~]# cat /etc/redhat-release CentOS release 6.5 (Final) [root@local ...

  5. COS-7设备管理

    操作系统(Operating System,简称OS)是管理和控制计算机硬件与软件资源的计算机程序,是直接运行在“裸机”上的最基本的系统软件,任何其他软件都必须在操作系统的支持下才能运行.   操作系 ...

  6. Spring_使用 NamedParameterJdbcTemplate

    applicationContext.xml <?xml version="1.0" encoding="UTF-8"?><beans xml ...

  7. Linux下MySQL 5.6.24的编译安装与部署

    MySQL 5.6正式版发布了,相对于5.5版本作出了不少改进,其源码安装配置方式也有所变化,本文根据实际操作,不断尝试,精确还原了安装的具体步骤. 在Linux下安装MySQL前,先确认卸载系统自带 ...

  8. Mysql 常用单词

    单词: CRUD:增删改查(create/read/update/delete) create:新增项目 read:查询 update:修改 delete:删除 desc 表名:查看表结构 drop: ...

  9. 【P2944】地震损失(最大流,洛谷)

    绝对难度虚高的一题 看到题目,至少损坏几个房子,开始考虑最小割,建的是双向边,所以拆点,边权除了自己与自己的之外都连inf.然后把所有求救的点都连到超级源上,跑一遍最大流就可以了. #include& ...

  10. NO.2 You must restart adb and Eclipse多种情形分析与解决方案

    一.问题描述:     运行android程序控制台输出     The connection to adb is down, and a severe error has occured.      ...