# 【CF】A. Fivesteps ## [題目連結](https://codeforces.com/group/AXj32pLpIx/contest/468825/problem/A) ## **時間複雜度** * $O(2^\frac{N}{2})$ ## **解題想法** 這一題從測資基本上就可以看出是要用折半枚舉去處理了,處理的方法是先枚舉陣列中前半每個位置的正跟負,並將結果記錄下來,最後枚舉後半所有位置的正負並計算答案就可以了 值得注意的是,枚舉前半的結果可以利用 `map` 來儲存,用以計算某個結果有幾種可能性 ## **完整程式** ```cpp= /* Question : CF 【2023 MD Player Training】 Simulation Contest 1 - A. Fivesteps */ #include<bits/stdc++.h> using namespace std; #define opt ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); #define pirq(type) priority_queue<type, vector<type>, greater<type>> #define mem(x, value) memset(x, value, sizeof(x)); #define pii pair<int, int> #define pdd pair<double, double> #define pb push_back #define f first #define s second #define int long long const auto dir = vector< pair<int, int> > { {1, 0}, {0, 1}, {-1, 0}, {0, -1} }; const int MAXN = 40 + 50; const int Mod = 1e9 + 7; int n, x, res, arr[MAXN]; map<int, int> mp; void f1( int cnt, int amt, int sum ){ if( cnt == amt + 1 ){ mp[sum]++; return; } f1(cnt+1, amt, sum + arr[cnt]); f1(cnt+1, amt, sum - arr[cnt]); } void f2( int cnt, int amt, int sum, int tar ){ if( cnt == amt + 1 ){ res += mp[tar-sum]; return; } f2(cnt+1, amt, sum+arr[cnt], tar); f2(cnt+1, amt, sum-arr[cnt], tar); } signed main(){ opt; cin >> n >> x; for( int i = 1 ; i <= n ; i++ ) cin >> arr[i]; f1(1, n/2, 0); f2(n/2+1, n, 0, x); cout << res << "\n"; } ```