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. koa2.0富文本编辑器的选择历程

    本人学习vue和koa2.0,做了一个简单的个人博客,博客自然会需要富文本编辑器的选择,由于nodejs和koa2.0,于是便开始了不断尝试的历程. 一.ueditor 刚开始在百度搜索,自然第一个发 ...

  2. Spark机器学习6·聚类模型(spark-shell)

    K-均值(K-mean)聚类 目的:最小化所有类簇中的方差之和 类簇内方差和(WCSS,within cluster sum of squared errors) fuzzy K-means 层次聚类 ...

  3. Django 函数和方法的区别

    函数和方法的区别 1.函数要手动传self,方法不用传 2.如果是一个函数,用类名去调用,如果是一个方法,用对象去调用 class Foo(object): def __init__(self): s ...

  4. EasyUI:获取某个dategrid的所有行数据

    EasyUI:获取某个dategrid的所有行数据 var rows = $("#grid").datagrid("getRows"); for(var i=0 ...

  5. Saltstack 命令行:批量发送命令,返回执行结果

    批量发送发送命令符,并返回结果. salt '*' cmd.run 'df -h' ---------------------------------------- Stest1: Filesyste ...

  6. 2018-2019-2 20165114《网络对抗技术》Exp1 逆向与Bof基础

    逆向及Bof基础实践 目录 一.实践目标 二.实验操作和步骤 1.直接修改程序机器指令 2.通过构造输入参数,造成BOF攻击. 3.注入Shellcode并执行 三.实验总结 四.实验遇到的错误和问题 ...

  7. 利用web workers实现多线程处理

    利用web workers在后台线程中实现对数据库的增删改查操作,并在后台线程中生成页面上某个列表的完整的HTML代码,然后再前台脚本中直接将这段HTML代码输出到页面上! 利用web workers ...

  8. iOS日常学习 - App之间常用的五种通信方式及适用场景总结

    本文为转载学习,原文地址 iOS系统是相对封闭的系统,App各自在各自的沙盒(sandbox)中运行,每个App都只能读取iPhone上iOS系统为该应用程序程序创建的文件夹AppData下的内容,不 ...

  9. 枚举处理工具类 .net

    将枚举转化成List<T>的方法如下: /// <summary> /// 枚举处理工具类 /// </summary> public class EnumHelp ...

  10. Generate parentheses,生成括号对,递归,深度优先搜索。

    问题描述:给n对括号,生成所有合理的括号对.比如n=2,(()),()() 算法思路:利用深度优先搜索的递归思想,对n进行深度优先搜索.边界条件是n==0:前面电话号组成字符串也是利用dfs. pub ...