BZOJ3612 [Heoi2014]平衡 整数划分
[Heoi2014]平衡
Time Limit: 10 Sec Memory Limit: 256 MB
Submit: 348 Solved: 273
[Submit][Status][Discuss]
Description
Input
第一行,一个正整数,表示数据组数 T(萱萱向你询问的次数)。
Output
共 T 行,每行一个正整数,代表你得出的对应问题的答案。
Sample Input
6 5 10000
4 1 10000
9 6 10000
4 6 10000
5 1 10000
8318 10 9973
9862 9 9973
8234 9 9973
9424 9 9973
9324 9 9973
Sample Output
1
920
8
1
4421
2565
0
446
2549
HINT
T <= 20,1 <= n <= 10000,1 <= k <= 10,2 <= p <= 10000,且 k <= 2n+1。
设f(i, j)表示把i分成j个不同的且<= n的整数的方案数。
考虑一般的整数划分数问题,f(i, j) = f(i-1, j-1) + f(i-j, j),其中第一项表示新填一个1,第二项表示把所有数都加1。
顺着这个思路,我们先考虑“不同”这个限制。
显然我们不能直接新填一个1,所以我们考虑把所有数加1,搞出来一个1,第一项得出为f(i-j, j-1)
第二项同样为f(i-j, j).
所以状态转移方程为f(i, j) = f(i-j, j) + f(i-j, j-1).
再考虑不能超过n这个限制,如果有超过n的数,显然它只有一个,而且是n+1,所以我们把这些情况减掉,即f(i-n-1, j-1).
统计答案时,考虑选了0和不选0,两种情况,并特判k=1.
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 101001
#define M 15
using namespace std;
int n,m,p,w;
int f[N][M]; // f[i][j] 表示
//将i划分成j个互不相同的正整数,
// 且最大不超过n 的划分方案数
int main()
{
int i,j,k,g;
f[][]=;
for(scanf("%d",&g);g--;)
{
scanf("%d%d%d",&n,&m,&p);
if(m==)
{
puts("");
continue;
}
w=n*(m-);
for(i=;i<=w;i++)
for(j=;j<m;j++)
{
f[i][j]=(i>=j?(f[i-j][j]+f[i-j][j-]):);
f[i][j]=(i>=n+)?(f[i][j]-f[i-n-][j-]):f[i][j];
f[i][j]=(f[i][j]%p+p)%p;
}
long long ans=;
for(i=;i<=w;i++)
for(j=;j<m;j++)
ans+=f[i][j]*f[i][m-j],ans%=p;
for(i=;i<=w;i++)
for(j=;j<m-;j++)
ans+=f[i][j]*f[i][m--j],ans%=p;
printf("%lld\n",ans);
}
}
BZOJ3612 [Heoi2014]平衡 整数划分的更多相关文章
- bzoj3612 [Heoi2014]平衡——整数划分
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3612 看了好久才弄清楚题意... 原来整数划分就是这样的啊:https://blog.csd ...
- bzoj 3612 [Heoi2014]平衡——整数划分(dp)
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3612 因为力矩的缘故,变成了整数划分. 学习到了整数划分.就是那个图一样的套路.https: ...
- [HEOI2014]平衡(整数划分数)
下课了,露露.花花和萱萱在课桌上用正三棱柱教具和尺子摆起了一个“跷跷板”. 这个“跷跷板”的结构是这样的:底部是一个侧面平行于地平面的正三棱柱教具,上面 摆着一个尺子,尺子上摆着若干个相同的橡皮.尺子 ...
- 【递推】Bzoj3612[Heoi2014]平衡
Description 下课了,露露.花花和萱萱在课桌上用正三棱柱教具和尺子摆起了一个“跷跷板”. 这个“跷跷板”的结构是这样的:底部是一个侧面平行于地平面的正三棱柱教具, 上面 摆着一个尺 ...
- bzoj3612: [Heoi2014]平衡
首先不可重的整数规划是fi,j=fi-1,j-i+fi,j-i的 然后现在加了一个限制,分成的数不能超过n,那么对于拼大于n的数的时候多减一个fi-1,j-n-1 接下来是优化代码暴露我自带巨大常数的 ...
- bzoj 3612: [Heoi2014]平衡【整数划分dp】
其实就是-n~n中求选k个不同的数,和为0的方案数 学到了新姿势叫整数划分,具体实现是dp 详见:https://blog.csdn.net/Vmurder/article/details/42551 ...
- BZOJ 3612: [Heoi2014]平衡( dp )
枚举Fl, 就变成一个整数划分的问题了...f(i,j) = f(i-j,j-1)+f(i-j,j)-f(i-N-1,j-1)递推.f(i,j)表示数i由j个不同的数组成,且最大不超过N的方案数 -- ...
- [HEOI2014]平衡
[HEOI2014]平衡 转化为求选择k个数,和为(n+1)*k的方案数 保证,每个数[1,2*n+1]且最多选择一次. 限制k个很小,所以用整数划分的第二种方法 f[i][j],用了i个,和为j 整 ...
- P4104 [HEOI2014]平衡
友情提醒:取模太多真的会TLE!!! P4104 [HEOI2014]平衡 题解 本题属于 DP-整数划分 类问题中的 把整数 n 划分成 k 个不相同不大于 m 的正整数问题 设置DP状态 f[ ...
随机推荐
- PAT (Basic Level) Practise (中文)- 1003. 我要通过!(20)
http://www.patest.cn/contests/pat-b-practise/1003 “答案正确”是自动判题系统给出的最令人欢喜的回复.本题属于PAT的“答案正确”大派送 —— 只要读入 ...
- Solaris&&QNX® Neutrino®&&OpenVMS&&FreeBSD&&AIX
原文链接Solaris (读作 /se'laris:/ 或者 /so'le:ris/ 或者 '梭拉瑞斯' )是Sun Microsystems研发的计算机 操作系统.它被认为是UNIX操作系统的衍生版 ...
- Scanner和 Random类,控制语句的例题,商品管理(直接赋值)
Scanner类的使用: import java.util.Scanner; class Demo02 { public static void main(String[] args) { //1.导 ...
- Vscdoe技巧1
vscdoe常用快捷键 主命令框 F1 或 Ctrl+Shift+P: 打开命令面板.在打开的输入框内,可以输入任何命令,例如: 按一下 Backspace 会进入到 Ctrl+P 模式 在 Ctrl ...
- Java基础面试操作题:读取该文件内容,并按照自然顺序排序后输出到 另一个文件中
package com.swift; import java.io.FileInputStream; import java.io.FileNotFoundException; import java ...
- V8引擎——详解
前言 JavaScript绝对是最火的编程语言之一,一直具有很大的用户群,随着在服务端的使用(NodeJs),更是爆发了极强的生命力.编程语言分为编译型语言和解释型语言两类,编译型语言在执行之前要先进 ...
- 【PHP】常用的PHP正则表达式收集整理
匹配中文字符的正则表达式: [\u4e00-\u9fa5]评注:匹配中文还真是个头疼的事,有了这个表达式就好办了 匹配双字节字符(包括汉字在内):[^\x00-\xff]评注:可以用来计算字符串的长度 ...
- ZendFramework-2.4 源代码 - 关于MVC - Model层类图
- JZOJ 5818. 【NOIP提高A组模拟2018.8.15】 做运动
5818. [NOIP提高A组模拟2018.8.15] 做运动 (File IO): input:running.in output:running.out Time Limits: 2000 ms ...
- A1002 A+B for Polynomials (25)(25 分)
1002 A+B for Polynomials (25)(25 分) This time, you are supposed to find A+B where A and B are two po ...