思路:

  这个题写了一个背包的解法,超时了。搜了下题解才发现我根本不会做。

  思路参见这个

  其实我们可以这样来考虑,求补集,用全集减掉不能组成2048的集合就是答案了。

  因为只要达到2048就可以了,所以求补集会大大减小枚举的次数。

代码:

  

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <string>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <set>
#include <functional>
#include <cctype>
#include <time.h> using namespace std; typedef __int64 ll; const int INF = <<;
const int MAXN = 1e5+;
const int MAXM = ;
const ll MOD = ; int cnt[MAXM];
ll dp[][MAXM];
ll fact[MAXN], inv[MAXN];
int n; ll myPow(ll x, int d) {
ll res = ;
while (d>) {
if (d&) res = (res*x)%MOD;
x = (x*x)%MOD;
d >>= ;
}
return res;
} inline ll C(int x, int y) {
return ((fact[x]*inv[y])%MOD * inv[x-y])%MOD;
} inline int lowBit(int x) {
return x&(-x);
} void solve() {
int sum = n;
for (int i = ; i < ; i++) sum -= cnt[<<i]; memset(dp, , sizeof(dp)); for (int j = min(, cnt[]); j >= ; j--) dp[][j] = C(cnt[], j); for (int i = ; i < ; i++) {
int cc = >>i;
for (int k = min(cc, cnt[<<i]); k >= ; k--) { //选k个
ll CC = C(cnt[<<i], k);
for (int j = k; j <= cc; j++) { //
dp[i][j] = (dp[i][j] + (((dp[i-][(j-k)<<]+dp[i-][(j-k)<<|])%MOD)*CC)%MOD )%MOD;
}
}
} ll ans = ((myPow(, n-sum)-dp[][])%MOD+MOD)%MOD;
ans = (ans*myPow(, sum))%MOD;
printf("%I64d\n", ans);
} int main() {
#ifdef Phantom01
freopen("HDU4945.txt", "r", stdin);
#endif //Phantom01 fact[] = ;
for (int i = ; i < MAXN; i++) fact[i] = (fact[i-]*i)%MOD;
inv[MAXN-] = myPow(fact[MAXN-], MOD-);
for (int i = MAXN-; i > ; i--) inv[i-] = (inv[i]*i)%MOD; int T = ; while (scanf("%d", &n)!=EOF && n!=) {
printf("Case #%d: ", T++);
memset(cnt, , sizeof(cnt));
int x;
for (int i = ; i < n; i++) {
scanf("%d", &x);
cnt[x]++;
}
solve();
} return ;
}

HDU 4945 2048 DP 组合的更多相关文章

  1. HDU 4945 2048(DP)

    HDU 4945 2048 题目链接 题意:给定一个序列,求有多少个子序列能合成2048 思路:把2,4,8..2048这些数字拿出来考虑就能够了,其它数字不管怎样都不能參与组成.那么在这些数字基础上 ...

  2. hdu 4945 2048 (dp+组合的数目)

    2048 Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submi ...

  3. HDU 4945 2048(dp)

    题意:给n(n<=100,000)个数,0<=a[i]<=2048 .一个好的集合要满足,集合内的数可以根据2048的合并规则合并成2048 .输出好的集合的个数%998244353 ...

  4. HDU 4945 (dp+组合数学)

    2048 Problem Description Teacher Mai is addicted to game 2048. But finally he finds it's too hard to ...

  5. hdu 4123 树形DP+RMQ

    http://acm.hdu.edu.cn/showproblem.php? pid=4123 Problem Description Bob wants to hold a race to enco ...

  6. hdu 4507 数位dp(求和,求平方和)

    http://acm.hdu.edu.cn/showproblem.php?pid=4507 Problem Description 单身! 依旧单身! 吉哥依旧单身! DS级码农吉哥依旧单身! 所以 ...

  7. hdu 3709 数字dp(小思)

    http://acm.hdu.edu.cn/showproblem.php?pid=3709 Problem Description A balanced number is a non-negati ...

  8. hdu 4352 数位dp + 状态压缩

    XHXJ's LIS Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  9. hdu 4283 区间dp

    You Are the One Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

随机推荐

  1. BZOJ 3676 [Apio2014]回文串 (后缀自动机+manacher/回文自动机)

    题目大意: 给你一个字符串,求其中回文子串的长度*出现次数的最大值 明明是PAM裸题我干嘛要用SAM做 回文子串有一个神奇的性质,一个字符串本质不同的回文子串个数是$O(n)$级别的 用$manach ...

  2. BZOJ 1878 HH的项链 (树状数组+离线)

    题目大意:给你一个序列,求某区间出现不同的数的个数. 貌似离线树状数组是最好的解法 先把所有询问挂在它们询问的右端点上 然后从头到尾遍历这个序列,记录这个位置的值上一次出现的位置 那么,当遍历到第i位 ...

  3. Uboot优美代码赏析1:目录结构和malkefile分析

    Uboot优美代码赏析1:目录结构和malkefile分析 关于Uboot自己选的版本是目前最新的2011.06,官方网址为:http://www.denx.de/wiki/U-Boot/WebHom ...

  4. 基于Quick_Thought Vectors的Sentence2Vec神经网络实现

    一.前言 1.Skip-Thought-Vector论文 https://github.com/ryankiros/skip-thoughts 2.本文假设读者已了解Skip-Gram-Vector和 ...

  5. NOIP2018提高组省一冲奖班模测训练(三)

    NOIP2018提高组省一冲奖班模测训练(三) 自己按照noip的方式考,只在最后一两分钟交了一次 第一题过了,对拍拍到尾. 第二题不会.考试时往组合计数的方向想,推公式,推了一个多小时,大脑爆炸,还 ...

  6. 使用Oracle Database Instant Client 精简版

    如果只为了在开发环境中访问Oracle,推荐使用Oracle Database Instant Client(精简版)它相对小巧且不需要安装绿色方便移植. 官方下载Instant Client,在Or ...

  7. VUE:过渡&动画

    VUE:过渡&动画 vue动画的理解 1)操作css的 trasition 或 animation 2)vue会给目标元素添加/移除特定的class 3)过渡的相关类名 xxx-enter-a ...

  8. ucore_lab1

    练习1:理解通过make生成执行文件的过程.(要求在报告中写出对下述问题的回答) 实验过程 静态分析代码. 实验的目录结构如下: . ├── boot ├── kern │   ├── debug │ ...

  9. tp volist需要便利两个数组时的处理办法

    你需要便利两个数组,并且需要使用key 和value的试的时候,volist是否先得有些捉鸡? 我们可以便利其中一个数组,而另一个利用数组的指针来操作 next($arr) 将数组指针下移 key($ ...

  10. iOS UI16_数据持久化

    // // Student.h // UI16_数据持久化 // // Created by dllo on 15/8/19. // Copyright (c) 2015年 zhozhicheng. ...