设f[i][j]为把i拆成j个不重复的、大于0小于等于N的数的方案数

我们考虑一个方案是怎么来的:(初始状态是f[0][0]=1)

  如果这个方案里有1,那它是先把原来的状态的每个数加1、然后再增加一个1

  如果这个方案没有1,那它是把原来的状态直接每个数加1得来的

就对应了方程$f[i][j]=f[i-j][j]+f[i-j][j-1]$

但这还不够,还没有限定这个数不能大于N

由于我们每次加的都是1,所以只需要把加出来了N+1的情况减掉就可以

那这个f[i][j]的包含N+1的状态,一定能由f[i-N-1][j-1],就是相当于直接把这个N+1去掉转移过来,把它减下去就可以了

然后枚举左右两边去的个数、再枚举力矩和,统计答案。注意是可以把正中间那个位置去掉的

 1 #include<bits/stdc++.h>
 2 #define pa pair<int,int>
 3 #define CLR(a,x) memset(a,x,sizeof(a))
 4 using namespace std;
 5 typedef long long ll;
 6 const int maxn=10010,maxk=12;
 7
 8 inline ll rd(){
 9     ll x=0;char c=getchar();int neg=1;
10     while(c<'0'||c>'9'){if(c=='-') neg=-1;c=getchar();}
11     while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
12     return x*neg;
13 }
14
15 int N,K,P;
16 int f[maxn*maxk][maxk];
17
18 inline void getf(){
19     CLR(f,0);
20     f[0][0]=1;
21     for(int i=1;i<=N*(K-1);i++){
22         for(int j=1;j<K&&i-j>=0;j++){
23             f[i][j]=f[i-j][j]+f[i-j][j-1]-(i-N-1>=0?f[i-N-1][j-1]:0);
24             f[i][j]%=P;
25             // printf("%d %d %d\n",i,j,f[i][j]);
26         }
27     }
28 }
29
30 int main(){
31     //freopen("","r",stdin);
32     int i,j,k;
33     for(int t=rd();t;t--){
34         N=rd(),K=rd(),P=rd();
35         int ans=0;
36         if(K==1){printf("1\n");continue;}
37         getf();
38         for(i=1;i<K;i++){
39             for(j=i;j<=N*i;j++){
40                 ans=(ans+1ll*f[j][i]*f[j][K-i]+1ll*f[j][i]*f[j][K-i-1])%P;
41                 // printf("!%d %d %d\n",i,j,ans);
42             }
43         }
44         printf("%d\n",ans);
45     }
46     return 0;
47 }

转载于:https://www.cnblogs.com/Ressed/p/9735702.html

bzoj3612 平衡 (dp)相关推荐

  1. LeetCode 1653. 使字符串平衡的最少删除次数(DP)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个字符串 s ,它仅包含字符 'a' 和 'b'​​​​ . 你可以删除 s 中任意数目的字符,使得 s 平衡 . 我们称 s 平衡的 当不存在下标 ...

  2. jzoj4616-[NOI2016模拟7.12]二进制的世界【平衡规划,dp】

    正题 题目大意 nnn个数,对于每个数找左边的一个数执行optoptopt操作使得答案最大,并且求有多少个数能够使得最大. 解题思路 我们设fi,jf_{i,j}fi,j​表示下一个数的后888位为i ...

  3. 数位DP 不断学习中。。。。

    1, HDU 2089  不要62 :http://acm.hdu.edu.cn/showproblem.php?pid=2089 题意:不能出现4,或者相邻的62, dp[i][0],表示不存在不吉 ...

  4. [HEOI2014]平衡(整数划分数)

    下课了,露露.花花和萱萱在课桌上用正三棱柱教具和尺子摆起了一个"跷跷板". 这个"跷跷板"的结构是这样的:底部是一个侧面平行于地平面的正三棱柱教具,上面 摆着一 ...

  5. ACM之路(16)—— 数位DP

    题目就是kuangbin的数位DP. 先讲C题,不要62,差不多就是一个模板题.要注意的是按位来的话,光一个pos是不够的,还需要一维来记录当前位置是什么数字,这样才能防止同一个pos不同数字的dp值 ...

  6. 1至m为PQ节点,m+1至n-1为PV节点,n为平衡节点

    %节点排序:1至m为PQ节点,m+1至n-1为PV节点,n为平衡节点 clear all; clc; data; Y=zeros(n); for i=1:n     if X(i,2)~=0;     ...

  7. #1300 : 展胜地的鲤鱼旗(dp)

    时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 岩手县北上市的「北上市立公园展胜地」,是陆奥国三大樱花名所之一.每年的四月中旬到五月初,这里都会举办盛大的祭奠.除了可以在 ...

  8. POJ 1655 Balancing Act[树的重心/树形dp]

    Balancing Act 时限:1000ms Description Consider a tree T with N (1 <= N <= 20,000) nodes numbered ...

  9. SPOJ - BALNUM Balanced Numbers(数位dp+进制转换)

    题目链接:点击查看 题目大意:给出平衡数的定义:每一个偶数出现的次数必须是奇数次,每一个奇数出现的次数必须是偶数次,求给定区间中有多少个平衡数 题目分析:数位dp,这个题目就难在怎么确定状态转移,本来 ...

  10. HDU - 3709 Balanced Number(数位dp)

    题目链接:点击查看 题目大意:将一串数字视为天平,两端平衡的数字称为平衡数,并求出一段闭区间中平衡数的个数.所谓的平衡条件即为力臂与 力相乘后两端的数量和可以抵消,例如数字4139可以视为以3为中轴的 ...

最新文章

  1. 在Red Hat Linux5下构建LAMP网站服务平台之MySQL、PHP的安装与配置
  2. 两种底层数据层操作时的架构方式,你喜欢那种?
  3. 网易云信10月大事记
  4. vba根据内容调整word表格_给你的word提速
  5. 大数据先行 传统金融转型需从体制上创新
  6. python io多路复用_Python之IO多路复用
  7. Vue2.0 的漫长学习ing-1-5
  8. 用java来实现列出指定目录下的文件,子目录下的文件也要输出
  9. Leetcod每日一题:151.reverse-words-in-a-string(翻转字符串里的单词)
  10. [Web Chart系列之七] 物理动画效果(如撕扯效果)
  11. ABP之Javascript生成
  12. bzoj2616:SPOJ PERIODNI
  13. 关于android studio的配置记录
  14. android端口扫描工具,Android系统端口扫描器编写初探
  15. _ie6png图片的修复
  16. 博途PLC如何通过FB285实现V90 PN的速度控制
  17. pdf怎么删除其中一页?
  18. “全包”给装修公司,验收时发现甲醛超标,能要求重装或赔偿吗?
  19. JSONPath库:使用类似Xpath的语法解析JSON数据
  20. Zigbee 设置信道,PANID,发射功率

热门文章

  1. 【渝粤教育】电大中专金融与税收_1作业 题库
  2. 【RLchina第二讲】 Foundations of Reinforcement Learning
  3. Pandas系列(八)字符串处理
  4. linux下的源代码分析工具understand 2014100328681022
  5. MySQL数据库删除数据(有外键约束)
  6. 浅谈欧几里得算法求最大公约数(GCD)的原理及简单应用
  7. 【转】VC6下安装与配置OpenCV1.0
  8. Postgresql_最新版11.2源码编译安装
  9. Qt: 非阻塞时间延迟;
  10. 003自动装配歧义性解决