jm是強迫症晚期患者,他執著於集合的完美性,他認為,如果乙個集合中所有元素之和恰好為\(0\),那麼這個集合是完美的。
給定乙個大小為\(n\)的可重複集合\(a\),判斷該集合存在多少個非空子集是完美的。
可重複集合的意思是集合中可能有重複的元素,此時也可能存在多個相同的滿足條件的子集,要按照多個來算。
第一行乙個正整數\(n\),表示集合大小。
第二行\(n\)個整數,表示集合中的元素。
一行乙個非負整數,表示滿足條件的非空子集的個數。
\(1\leq n \leq 35\)
\(-5 \times 10^7 \leq a_i \leq 5\times 10^7\)
乙個簡單的想法就是直接dfs,然而\(n\)範圍到\(35\),會炸。
那麼記憶化搜尋呢,不行,數太大,空間不夠。
所以我們做這樣的處理:我們把原集合分成兩半,在第乙個集合中,我們遍歷所有的取數可能,假設當前取到的sum為\(x\),然後,我們再在第二個集合中找————有多少種取數方法使\(sum'=-x\)
而對於這兩個小集合,集合大小都是18以內,計算一下\(2^=262144\),不會tle,完美!
所以我們先操作第二個集合,把所有可能的值扔到乙個multiset裡面便於查詢。
注意!!!我們這麼做會多算一種情況,就是什麼都不選,這是不合題意的,所以ans要-1
可是毒瘤出題人卡multiset,這種做法只能拿到95分(真是*疼的分數。。。)
不過,趁此機會練習一下資料結構也是不錯的呢。
#include #include #include #include #define ll long long
using namespace std;
ll a[40];
multisets;
int main()
s.insert(0);
t = 1 << (n >> 1);
for (i = 1; i < t; i++)
s.insert(sum);
}t = 1 << ((n + 1) >> 1);
for (i = 0; i < t; i++)
ans += s.count(-sum);
}ans--;
printf("%lld", ans);
return 0;
}
#include #define ll long long
#define maxn 300000
using namespace std;
ll a[40];
struct splaytree tree[maxn];
int root, size;
private:
void zig(int x)
void zag(int x)
void splay(int x) else else if (tree[z].rson == y && tree[y].rson == x) else if (tree[z].lson == y && tree[y].rson == x) else }}
root = x;
}void insert(int pos, int x)
if (tree[pos].val < tree[x].val)
} else
}return;
}int build(ll x)
ll query(int pos, ll x)
int find(int pos, ll x)
public:
void push(ll x)
ll count(ll x)
void clear()
} s;
int main()
s.clear();
s.push(0);
t = 1 << (n >> 1);
for (register int i = 1; i < t; ++i)
s.push(sum);
}t = 1 << ((n + 1) >> 1);
for (register int i = 0; i < t; ++i)
ans += s.count(-sum);
}ans--;
printf("%lld", ans);
return 0;
}
1017 乘積最大
題目描述 description 今年是國際數學聯盟確定的 2000 世界數學年 又恰逢我國著名數學家華羅庚先生誕辰90周年。在華羅庚先生的家鄉江蘇金壇,組織了一場別開生面的數學智力競賽的活動,你的乙個好朋友xz也有幸得以參加。活動中,主持人給所有參加活動的選手出了這樣一道題目 設有乙個長度為n的數...
1017 乘積最大
題目描述 description 今年是國際數學聯盟確定的 2000 世界數學年 又恰逢我國著名數學家華羅庚先生誕辰90周年。在華羅庚先生的家鄉江蘇金壇,組織了一場別開生面的數學智力競賽的活動,你的乙個好朋友xz也有幸得以參加。活動中,主持人給所有參加活動的選手出了這樣一道題目 設有乙個長度為n的數...
10 17 考試總結
2017年10月17日 noip模擬賽 第一道題是模擬。大致的思路是判斷所有錯誤的情況,比如兩個運算子連用 括號不匹配。正確的情況很多,但是錯誤的型別就那麼幾種,依次判斷一下。在輸入的時候可以有乙個技巧,對於數字來說,乙個數字和連續的多個數字是一樣的,所以在前乙個字元是數字時,如果下乙個讀入的也是數...