博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[HEOI2014]平衡
阅读量:7078 次
发布时间:2019-06-28

本文共 1453 字,大约阅读时间需要 4 分钟。

转化为求选择k个数,和为(n+1)*k的方案数

保证,每个数[1,2*n+1]且最多选择一次。

限制k个很小,所以用整数划分的第二种方法

f[i][j],用了i个,和为j

整体+1,或者取一个1再整体加1(为了保证只选择一次)

j>=2*n+2时,整体+1,所以必然存在一个选择了2*n+2的方案,减掉f[i-1][j-(2*n+2)]即可

#include
#define reg register int#define il inline#define fi first#define se second#define mk(a,b) make_pair(a,b)#define numb (ch^'0')using namespace std;typedef long long ll;template
il void rd(T &x){ char ch;x=0;bool fl=false; while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true); for(x=numb;isdigit(ch=getchar());x=x*10+numb); (fl==true)&&(x=-x);}template
il void output(T x){
if(x/10)output(x/10);putchar(x%10+'0');}template
il void ot(T x){
if(x<0) putchar('-'),x=-x;output(x);putchar(' ');}template
il void prt(T a[],int st,int nd){
for(reg i=st;i<=nd;++i) ot(a[i]);putchar('\n');}namespace Miracle{int f[11][(10000+1)*10+5];int n,k,p;int main(){ int t; rd(t); while(t--){ rd(n);rd(k);rd(p); memset(f,0,sizeof f); f[0][0]=1; for(reg j=1;j<=(n+1)*k;++j){ for(reg i=1;i<=min(k,j);++i){ f[i][j]=(f[i][j-i]+f[i-1][j-i]-(j>=(n+1)*2?f[i-1][j-(n+1)*2]:0)+p)%p; } } printf("%d\n",f[k][(n+1)*k]); } return 0;}}signed main(){ Miracle::main(); return 0;}/* Author: *Miracle* Date: 2019/3/20 16:26:21*/

 

转载于:https://www.cnblogs.com/Miracevin/p/10565864.html

你可能感兴趣的文章
input框限制只能输入正整数、字母、小数、汉字
查看>>
SQL Server 之登录
查看>>
21-Python与设计模式--备忘录模式
查看>>
JavaScript学习(1)之JavaScript基础
查看>>
用verilog模拟DDS产生正弦波信号
查看>>
Spring中如何使用设计模式
查看>>
聊聊Dubbo(九):核心源码-服务端启动流程2
查看>>
BZOJ 4589 Hard Nim
查看>>
从源码分析如何优雅的使用 Kafka 生产者
查看>>
js实现touch移动触屏滑动事件
查看>>
XAMPP PHPSTORM XDEBUG 配合使用
查看>>
51 nod 1681 公共祖先 (主席树+dfs序)
查看>>
jquery easy ui
查看>>
mysql编程--创建函数出错的解决方案
查看>>
递归案例:汉诺塔问题
查看>>
Lucene 个人领悟 (二)
查看>>
JSVC技术
查看>>
Js 之 递归,闭包
查看>>
洪小瑶学IOS(一):准备起航 <Objective-C基础教程>笔记
查看>>
控件(文本类): TextBox, PasswordBox
查看>>