Hdu 5793 A Boring Question
链接
题意
$\sum_{0\leq k_{1},k_{2},\cdots k_{m} \leq n} \prod_{1\leqslant j <m}\binom{k_{j+1}}{k_{j}} \% 1000000007=?$
其中$\binom{k_{j+1}}{k_{j}}=\frac{k_{j+1}!}{k_{j}!\left ( k_{j+1}-k_{j} \right )!}$
分析
参考代码
1 | #include<stdio.h> |
Hdu 5794 A Simple Chess
链接
题意
有一个n*m的棋盘,有一个棋子要从(1,1),走到(n,m),问有多少中走法?
每次只能从往右下走日字形,且棋盘上有些障碍点,障碍点不能放棋子。
分析
若不考虑障碍,从(a,b)点到(c,d)点,设走(2,1)有lt步,(1,2)有up步,则
lt=(2*(c-a)-(d-b))/3,up=(2*(d-b)-(c-a))/3;
可以计算出(1,1)到(n,m)以及各个障碍物的方案数,依次从上往下,从左往右
计算各个障碍对其他点的方案的贡献值并更新其他点,最终可算出到(n,m)的方案数。
题中涉及到求组合数取余,数据范围较大,需用到Lucas定理:
参考代码
1 | #include<stdio.h> |
Hdu 5795 A Simple Nim
链接
题意
普通的Nim博弈的基础上多了一个操作,可选择任意一堆物品,
将其分成三堆(不能分出空对),求谁会赢得游戏
分析
sg[0]=0
当x=8k+7时sg[x]=8k+8,
当x=8k+8时sg[x]=8k+7,
其余时候sg[x]=x;(k>=0)
打表找规律可得,数学归纳法可证。
参考代码
1 | #include<stdio.h> |
Hdu 5800 To My Girlfriend
链接
题意
给定包含n个元素的集合,问存在多少个子集,满足:
其中有两个元素必选,两个元素必不选,其和为m(1<=m<=s)
分析
令dp[i][j][s1][s2]表示前i个物品填了j的体积,有s1个物品选为为必选,s2个物品选为必不选的方案数(0<=s1,s2<=2),对于每一个物品,有四种状态:不选,选,必选,必不选,则有转移方程
dp[i][j][s1][s2] = dp[i - 1][j][s1][s2] +
dp[i - 1][j-a[i]][s1][s2] +
dp[i - 1][j - a[i]][s1 - 1][s2] +
dp[i - 1][j][s1][s2 - 1],
边界条件为dp[0][0][0][0] = 1
参考代码
1 | #include<stdio.h> |
Hdu 5802 Windows 10
链接
题意
某人需调节电脑音量,他有三种操作,按上键,按下键,休息,每次操作需一秒。
按上键:每次音量增加1,休息:音量不变
下键:第一次按音量减小1,若上一秒按下键音量降低了x,则这秒降低2x,
若上一秒按的上键,或休息,则这秒按下键减小1
求将音量p调到q至少要多少秒?
分析
贪心+dfs
比较直观的看法是使劲往下降,然后升回来
或者使劲往下降然后停顿然后再使劲往下降。。。
于是就能将问题变成一个子问题,然后dfs就好
需要注意的是由于按up键也可以打断连续向下的功效
所以应该记录停顿了几次,以后向上的时候用停顿补回来
参考代码
1 | #include<stdio.h> |