对于一个定长(size = n)的数列a, 若其存在“位置相关”的子集(含空集)使得该子集所有元素之和为k,那么将数列a计数。

其中数列a中任一元素a[i]在[0, l]内自由取值。

数据条件0≤n, k ≤ 20, 0≤ l ≤ 1e9,计数结果对mod = 1e9 + 7取模。

无论直接计数还是考虑从反面计数都解决不了去重的问题,只能考虑dp。

枚举数列的长度i和压缩后的状态j,并且记录在该条件下的数列选取方案数dp[i][j]。

压缩后的状态j表示对于集合{1, 2, ..., min(l, k)}的选取情况。

其中集合中第i个元素在状态j中当且仅当j的二进制串的第i位为1。

显然我们有dp[0][0] = 1。

对于长度为p的数组,第p位可以选取的元素是0,1,2,...,l

考虑p位选取1,2,...,min(l, k)

那么对于数组长度为p-1时的任一状态j,在数组后追加元素i后的状态为:

j1 = j | ((j << i) & ((1 << k) - 1)) | (1 << (i - 1))

三部分分别表示原状态,原状态每个元素与元素i求和后增加的状态,i本身。

于是dp[p][j1] += dp[p - 1][j]。

而对于p位选取0或者大于min(l, k)的情形,j1 = j。

因此有dp[p][j] = (l - min(l, k)) * dp[p - 1][j]。

我们最后只需对dp[n][j],其中j第k位为1的累加即可。

由于数列每个元素非负,我们最后只关心那些集合存在和为k的子集,

而那些大于k的元素必然不是构成子集的元素,只有那些小于k的元素才对状态转移有用。

因此我们可以这样表示状态。

 #include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>
#include <string>
#include <vector>
#include <set>
#include <cmath>
#include <ctime>
using namespace std;
#define lson (u << 1)
#define rson (u << 1 | 1)
typedef __int64 ll;
const int maxn = 1e6 + ;
const int maxm = ;
const ll mod = 1e9 + ; int n, l, k;
ll dp[( << ) + ];
int main(){
int T;
scanf("%d", &T);
while(T--){
scanf("%d%d%d", &n, &k, &l);
ll d = abs(l - k);
l = min(l, k);
int s = ( << k) - ;
memset(dp, , sizeof dp);
dp[] = ;
while(n--){
for(int j = s; j >= ; j--){
ll tem = dp[j];
if(!tem) continue;
for(int p = ; p <= l; p++){
int nex = ( << (p - )) | j | ((j << p) & s);
dp[nex] = (dp[nex] + tem) % mod;
}
dp[j] = (tem * ( + d)) % mod;
}
}
ll ans = ;
for(int i = s; i >= ; i--)
if(i & ( << (k - )))
ans = (ans + dp[i]) % mod;
printf("%I64d\n",ans);
}
return ;
}

hdoj4906 Our happy ending(2014 Multi-University Training Contest 4)的更多相关文章

  1. HDU4888 Redraw Beautiful Drawings(2014 Multi-University Training Contest 3)

    Redraw Beautiful Drawings Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  2. hdu 4946 2014 Multi-University Training Contest 8

    Area of Mushroom Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  3. 2014 Multi-University Training Contest 9#11

    2014 Multi-University Training Contest 9#11 Killing MonstersTime Limit: 2000/1000 MS (Java/Others)   ...

  4. 2014 Multi-University Training Contest 9#6

    2014 Multi-University Training Contest 9#6 Fast Matrix CalculationTime Limit: 2000/1000 MS (Java/Oth ...

  5. 2014 Multi-University Training Contest 1/HDU4861_Couple doubi(数论/法)

    解题报告 两人轮流取球,大的人赢,,, 贴官方题解,,,反正我看不懂.,,先留着理解 关于费马小定理 关于原根 找规律找到的,,,sad,,, 非常easy找到循环节为p-1,每个循环节中有一个非零的 ...

  6. 2014 Multi-University Training Contest 1/HDU4864_Task(贪心)

    解题报告 题意,有n个机器.m个任务. 每一个机器至多能完毕一个任务.对于每一个机器,有一个最大执行时间Ti和等级Li,对于每一个任务,也有一个执行时间Tj和等级Lj.仅仅有当Ti>=Tj且Li ...

  7. 2016 Al-Baath University Training Camp Contest-1

    2016 Al-Baath University Training Camp Contest-1 A题:http://codeforces.com/gym/101028/problem/A 题意:比赛 ...

  8. hdu 4937 2014 Multi-University Training Contest 7 1003

    Lucky Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) T ...

  9. hdu 4941 2014 Multi-University Training Contest 7 1007

    Magical Forest Time Limit: 24000/12000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Other ...

随机推荐

  1. C++Primer 第七章

    //1.定义在类内部的函数是隐式内联的. //2.默认情况下,this指针的类型是指向类类型非常量版本的常量指针.对于类的常量成员函数的声明方法是:将const放置于成员函数的参数列表后,用于修饰th ...

  2. Swift游戏实战-跑酷熊猫 12 与平台的碰撞

    这节主要实现熊猫和平台的碰撞,实现熊猫在平台上奔跑 要点 对平台进行物理属性设置 //设置物理体以及中心点 self.physicsBody = SKPhysicsBody(rectangleOfSi ...

  3. pg_rewind 介绍

    pg_rewind—使一个PostgreSQL数据目录与另一个数据目录(该目录从第一个PostgreSQL数据目录创建而来)一致. 描述 pg_rewind是一个在集群的时间线参数偏离之后,用于使一个 ...

  4. Leetcode: Range Sum Query 2D - Mutable && Summary: Binary Indexed Tree

    Given a 2D matrix matrix, find the sum of the elements inside the rectangle defined by its upper lef ...

  5. 转:python webdriver API 之定位 frame 中的对象

    在 web 应用中经常会出现 frame 嵌套的应用,假设页面上有 A.B 两个 frame,其中 B 在 A 内,那么定位 B 中的内容则需要先到 A,然后再到 B.switch_to_frame  ...

  6. 暴力枚举-数长方形(hdu5258)

    数长方形 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  7. CSS3 filter:drop-shadow滤镜与box-shadow区别应用 抄的

    CSS3 filter:drop-shadow滤镜与box-shadow区别应用 这篇文章发布于 2016年05月18日,星期三,01:07,归类于 css相关. 阅读 5777 次, 今日 12 次 ...

  8. R12 供应商SQL

    -- 供应商主表数据: SELECT ass.vendor_id vendor_id, ass.party_id party_id, ass.segment1 vendor_code, ass.ven ...

  9. mybatis(二)执行CRUD操作的两种方式配置和注解

    一.使用MyBatis对表执行CRUD操作——基于XML的实现 1.定义sql映射xml文件 userMapper.xml文件的内容如下: <?xml version="1.0&quo ...

  10. 夺命雷公狗—angularjs—7—多条数据的遍历

    我们这里可以来玩玩angular的块级的遍历方法了,本热感觉有点像是PHP中的以前刚入门时候的遍历方法,嘻嘻,, 不过要注意的是中间的双层汉堡{{}} 里面只能放表达式,不能放判断语句 <!do ...