思路:

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

  思路参见这个

  其实我们可以这样来考虑,求补集,用全集减掉不能组成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 ;
}

最新文章

  1. Direct2D相关
  2. ANT命令总结(转载)
  3. Linux后台开发面试问题汇总
  4. SVN的学习以及使用!
  5. 【翻译】Sencha Touch 2入门:创建一个实用的天气应用程序之三
  6. Vue --- :is
  7. IM群聊消息的已读回执功能该怎么实现?
  8. ASPxGridView 用法
  9. javaScript中的querySelector()与querySelectorAll()的区别
  10. Vsftp安装及配置主动模式/被动模式
  11. The packaging and installation process of Android programs
  12. 网易微专业 UI设计师
  13. ndk的注意事项
  14. Hibernate: ids for this class must be manually assigned before calling save():
  15. windows与Linux实现文件传输Winscp工具的使用
  16. founder面试题
  17. POJ2728 Desert King 最优比率生成树
  18. 《Algorithms算法》笔记:元素排序(4)——凸包问题
  19. 20165322 实验三 敏捷开发与XP实践
  20. 【WPF】创建基于模板的WPF控件(经典)

热门文章

  1. java的插入排序
  2. C语言基本语法——字符串
  3. 《一个民企CEO的职场阳谋》–读书总结(下)
  4. C#-入门思维导图
  5. cogs 2752. [济南集训 2017] 数列运算
  6. C++ OTL MySQL(Windows/Linux) V8.1
  7. struct和typedef
  8. python爬虫 分页获取图片并下载
  9. MySQL事件调度器Event Scheduler
  10. hdu 4628 Pieces(状态压缩+记忆化搜索)