计蒜客-2017 计蒜之道 复赛-F-腾讯消消乐
2017-06-12 00:28
246 查看
ACM模版
![](http://img.blog.csdn.net/20170612002410040?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZl96eWo=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
![](http://img.blog.csdn.net/20170612002421634?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZl96eWo=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
dp[i][j] 表示第 i 次操作,状态为 j 的方案数,其中 j 的对应二进制位 0 表示未删除,1 表示已经删除。
描述
题解
典型的状压 dp,因为最多 18 个,所以状态是有限的,也就 218 个状态,加上滚动数组优化,累加求 ans 即可。dp[i][j] 表示第 i 次操作,状态为 j 的方案数,其中 j 的对应二进制位 0 表示未删除,1 表示已经删除。
代码
#include <iostream> #include <cstdio> #include <vector> #include <cstring> using namespace std; typedef long long ll; const ll MAXN = 18; const ll MOD = 1e9 + 7; ll A[MAXN + 10]; ll dp[2][(1 << MAXN) + 10]; inline void mod(ll &x) { x -= x / MOD * MOD; } inline ll gcd(ll a, ll b) { return b == 0 ? a : gcd(b, a % b); } vector<ll> vl; int main() { ll n, k; cin >> n >> k; for (int i = 1; i <= n; i++) { cin >> A[i]; } int cnt = 0, w; ll a; for (int i = 1; i <= n; i++) { a = A[i]; w = 0; for (int j = i; j <= n; j++) { if ((a = gcd(a, A[j])) >= k) { w ^= 1 << (n - j); dp[cnt][w] = 1; } else { break; } } } cnt++; ll t, j_, sz, ans = 0; for (int i = 2; i <= n; i++, cnt ^= 1) { memset(dp[cnt], 0, sizeof(dp[cnt])); ans += (i - 1) * dp[cnt ^ 1][(1 << n) - 1]; ans %= MOD; for (int j = 0; j < (1 << n); j++) { // cout << dp[cnt^1][j] << ' '; if (dp[cnt ^ 1][j] == 0) { continue; } t = n; j_ = j; vl.clear(); while (t) { if (!(j_ & 1)) { vl.push_back(t); } j_ >>= 1; t--; } sz = vl.size(); for (int i_ = 0; i_ < sz; i_++) { a = A[vl[i_]]; w = 0; for (int j_ = i_; j_ < sz; j_++) { if ((a = gcd(a, A[vl[j_]])) >= k) { w ^= 1 << (n - vl[j_]); dp[cnt][j ^ w] += dp[cnt ^ 1][j]; dp[cnt][j ^ w] %= MOD; } else { break; } } } } // putchar(10); } ans += n * dp[cnt ^ 1][(1 << n) - 1]; ans %= MOD; cout << ans << endl; return 0; }
相关文章推荐
- 计蒜客 2017 复赛 腾讯消消乐 (状压dp)
- 2017 计蒜之道 复赛 腾讯消消乐【状压dp】
- 计蒜之道 2017 程序设计大赛 - 计蒜客 复赛 F 腾讯消消乐 状态压缩dp、枚举+剪枝
- 2017 计蒜之道 复赛 腾讯消消乐
- 计蒜之道-2017复赛-腾讯消消乐(状压DP)
- 计蒜客 2017 复赛 腾讯消消乐 状压dp
- 计蒜之道-2017复赛-腾讯消消乐(状压DP)
- (状压dp)2017 计蒜之道 复赛 F. 腾讯消消乐
- 计蒜之道复赛 腾讯消消乐
- 计蒜客 腾讯消消乐
- 计蒜客-2017 计蒜之道 复赛-D-百度地图导航
- 计蒜客-2017 计蒜之道 复赛-B-Windows 画图
- 计蒜客 15971 腾讯消消乐 题解
- hdu 4542 数论 + 约数个数相关 腾讯编程马拉松复赛
- [最大密度子图] 2017 计蒜之道 初赛 第三场. 腾讯狼人杀
- 腾讯2017秋招笔试编程题(二)----游戏任务标记
- 【真题】腾讯2017暑假实习生编程题 算法基础-字符移位
- geohash编码 (腾讯2017校招开发工程师试卷一)
- 2017计蒜之道复赛 百度地图导航
- 2017 计蒜之道 初赛 第三场-A. 腾讯课堂的物理实验