hdu 5460 Poker(暴力)
2015-10-08 13:35
330 查看
题目链接:hdu 5460 Poker
解题思路
暴力+剪枝,处理出每个集合下可以得到的数,卡一个常数。代码
#include <cstdio> #include <cstring> #include <map> #include <algorithm> using namespace std; const int maxn = (1<<8)+5; const int limit = 32 * 13 * 13; typedef long long ll; typedef map<int,ll>::iterator iter; int N, Q, X[20], multi[maxn], ct[maxn]; map<int, ll> G[maxn]; int bitcount(int s) { return s == 0 ? 0 : bitcount(s>>1) + (s&1); } void add (int u, int s, ll k) { if (s < 0) return; //if (!G[u].count(s)) G[u][s] = 0; G[u][s] += k; } void merge(int u, int p, int q) { for (iter i = G[p].begin(); i != G[p].end(); i++) { for (iter j = G[q].begin(); j != G[q].end(); j++) { ll k = 1LL * i->second * j->second; add(u, i->first + j->first, k * 2); add(u, i->first * j->first, k * 2); add(u, i->first - j->first, k); add(u, j->first - i->first, k); if (i->first && j->first % i->first == 0) add(u, j->first / i->first, k); if (j->first && i->first % j->first == 0) add(u, i->first / j->first, k); } } } ll solve () { ll ret = 0; for (int i = 1; i < (1<<N); i++) { int cbit = bitcount(i); for (int u = i; u; u = (u-1)&i) { int v = u^i; if (u < v) break; merge(i, u, v); } if (G[i].count(Q)) ret += G[i][Q] * cbit * cbit; } return ret; } int main () { int cas; scanf("%d", &cas); for (int kcas = 1; kcas <= cas; kcas++) { scanf("%d%d", &N, &Q); for (int i = 0; i < (1<<N); i++) G[i].clear(); for (int i = 0; i < N; i++) { scanf("%d", &X[i]); G[1<<i][X[i]] = 1; } printf("Case #%d: %lld\n", kcas, solve()); } return 0; }
相关文章推荐
- Android的一些错误集合!
- xinetd: unrecognized service
- 简单的STM32 汇编程序—闪烁LED
- RHEL6.5编译安装MySQL5.6.26教程
- Hive安装与配置——深入浅出学Hive
- Ajax与DOM实现动态加载
- 实用的AndroidStudio快捷键
- 计算机数据表示 源码、反码、补码、移码
- C# dataGridView的使用
- 修改app在设备上的显示名称
- ubuntu配置多网,网关不起作用的问题
- poj2389-Bull Math(大整数乘法)
- 自定义装饰类
- NSDate 的一些操作(比较、创建、在现有date加减一定时间等)
- LeetCode(90) Subsets II
- 7th_drv.c
- LeetCode(90) Subsets II
- Moravec算子
- Android 图像处理(浮雕、复古、怀旧等)
- Apache 与 php的配置