CF-525E(E. Anya and Cubes) Meet-in-the-Middle
生活随笔
收集整理的這篇文章主要介紹了
CF-525E(E. Anya and Cubes) Meet-in-the-Middle
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
CF-525E(E. Anya and Cubes) Meet-in-the-Middle
題目鏈接
題意
n(n≤25)n(n \le 25)n(n≤25)個數字 kkk次染色機會.選擇一個數字并對它染色貢獻為ai!a_i!ai?!,不對它染色貢獻為aia_iai?;不選擇這個數字貢獻為0.求一共有多少種方案在染色不超過kkk次的前提下使得總的貢獻為S(S≤1016)S(S \le10^{16})S(S≤1016)
思路
meet-in-the-middle
把n個數字分成兩部分,每個dfs找三種狀態(tài)復雜度為O(3n2)O(3^{\frac{n}{2}})O(32n?)
#include <bits/stdc++.h> using namespace std; int n, k; long long S, ans; map<long long, int> mp[26]; long long f[20], a[30]; void dfs1(int l, int r, int usek, long long sum) {if (usek > k || sum > S) return;if (l > r) {mp[usek][sum]++;return;}dfs1(l+1, r, usek, sum);dfs1(l+1, r, usek, sum+a[l]);if (a[l] < 20) dfs1(l+1, r, usek+1, sum+f[a[l]]); } void dfs2(int l, int r, int usek, long long sum) {if (usek > k || sum > S) return;if (l > r) {for (int i = 0; i + usek <= k; ++i) {if (mp[i].count(S-sum)) ans += mp[i][S-sum]; }return;}dfs2(l+1, r, usek, sum);dfs2(l+1, r, usek, sum+a[l]);if (a[l] < 20) dfs2(l+1, r, usek+1, sum+f[a[l]]); }int main() {f[0] = 1;for (int i = 1; i < 20; ++i) f[i] = f[i-1] * i;scanf("%d %d %lld", &n, &k, &S);for (int i = 1; i <= n; ++i) scanf("%lld", &a[i]);int mid = (1+n) >> 1;ans = 0;dfs1(1, mid, 0, 0);dfs2(mid+1, n, 0, 0);printf("%lld\n", ans);return 0; }總結
以上是生活随笔為你收集整理的CF-525E(E. Anya and Cubes) Meet-in-the-Middle的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CF - 741(C. Arpa’s o
- 下一篇: CF-477C(Dreamoon and