博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
our happy ending(状压dp)
阅读量:5341 次
发布时间:2019-06-15

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

题意:给定一个n,k,l。

问有多少长度为n的序列满足选出一些数使得他们相加为k,数列中每个数都在1-l以内。

Solution

正解还是很妙的。

状压dp,设dp[i][j]表示长度为i的序列,能表示出集合为j的序列个数。

这个状态非常好,我们每局下一个可填的数,可选集合就变成了j|(1<<p-1)|(j<<p&size)

Code

#include
#include
#include
using namespace std;typedef long long ll;const int mod=1e9+7;ll dp[1<<20],ans;int n,k,l,t,ma;int main(){ scanf("%d",&t); while(t--){ scanf("%d%d%d",&n,&k,&l); memset(dp,0,sizeof(dp)); ma=(1<
=0;--j)if(dp[j]){ ll pu=dp[j]; for(int p=1;p<=min(k,l);++p) { int x=(1<
<
mod)dp[x]-=mod; } if(l>k){ dp[j]+=(pu*(l-k))%mod; if(dp[j]>mod)dp[j]-=mod; } }ans=0; for(int i=1;i<=ma;++i)if(i&(1<
mod)ans-=mod;} printf("%lld\n",ans); } return 0;}

 

转载于:https://www.cnblogs.com/ZH-comld/p/9682255.html

你可能感兴趣的文章
c++中的string常用函数用法总结!
查看>>
界面交互之支付宝生活圈pk微信朋友圈
查看>>
[DLX精确覆盖+打表] hdu 2518 Dominoes
查看>>
SuperMap iServerJava 6R扩展领域开发及压力测试---判断点在那个面内(1)
查看>>
Week03-面向对象入门
查看>>
一个控制台程序,模拟机器人对话
查看>>
web.xml 中加载顺序
查看>>
pycharm激活地址
查看>>
hdu 1207 四柱汉诺塔
查看>>
Vue 2.x + Webpack 3.x + Nodejs 多页面项目框架(上篇——纯前端多页面)
查看>>
display:none与visible:hidden的区别
查看>>
我的PHP学习之路
查看>>
【题解】luogu p2340 奶牛会展
查看>>
对PostgreSQL的 SPI_prepare 的理解。
查看>>
解决响应式布局下兼容性的问题
查看>>
京东静态网页练习记录
查看>>
使用DBCP连接池对连接进行管理
查看>>
【洛谷】【堆+模拟】P2278 操作系统
查看>>
hdu3307 欧拉函数
查看>>
Spring Bean InitializingBean和DisposableBean实例
查看>>