有一天,你實驗室的老闆給你布置的這樣乙個實驗。
首先他拿出了兩個長度為 n 的數列 a 和 b,其中每個 a i 以二進位制表示乙個集
合。例如數字 5 = (101) [2] 表示集合 。第 i 次實驗會準備乙個小盒子,裡面裝
著集合 a i 所有非空子集的紙條。老闆要求你從中摸出一張紙條,如果滿足你摸出的
紙條是 a i 的子集而不是 a i−b i ,a i−b i +1 ,...,a i−1 任意乙個的子集,那麼你就要被阿掉;
反之,你就逃過一劫。
令你和老闆都沒有想到的是,你竟然每次都逃過一劫。在慶幸之餘,為了知道
這件事發生的概率,你想要算出每次實驗有多少紙條能使你被阿掉
第一行乙個數字 n。
接下來 n 行,每行兩個整數,分別表示 a i 和 b i 。
n 行,每行乙個數字,表示第 i 次實驗能使你被啊掉的紙條數。
樣例輸入 1
37 0
15 1
3 1樣例輸出 178
04對於 30% 的資料,n, a i , b i ≤ 100
對於 70% 的資料,n, a i , b i ≤ 60000
對於 100% 的資料,n, a i , b i ≤ 10 5
保證所有的 a i 不重複,b i < i
#include #include #define ll long long
#define r register
#define file(x) freopen(x".in","r",stdin);freopen(x".out","w",stdout);
using namespace std;
inline int read()
while (c>='0'&&c<='9')
return x*f;
}const int maxn=1e5+5;
int n,a,b,ans,f[maxn];
void init()
void doit()
printf("%d\n",ans); }}
signed main()
二進位制列舉子集
利用二進位制的 開關 特性列舉 詳細為 如果給定集合a大小為n,則想象a 的每乙個元素相應乙個開關位 0或1 0表示不出現,1表示出現。當每乙個元素的開關位的值確定時,就得到乙個子集。因此共同擁有2 n 1種情況 全0為空集,這裡不考慮 我們利用區間 1,2 n 1 該區間上的每乙個整數相應乙個子集...
技巧 二進位制法列舉子集
我們來看乙個可以用二進位制列舉的方法解決的題目 話說大詩人李白,一生好飲 幸好他從不開車 一天,他提著酒壺,從家裡出來,酒壺中有酒兩斗 他邊走邊唱 無事街上走,提壺去打酒 逢店加一倍,遇花喝一斗 這一路上,他一共遇到店 5 次,遇到花 10 次,已知最後一次遇到的是花,他正好把酒喝光了 請你計算李白...
位運算二進位制列舉子集 李白喝酒
話說大詩人李白,一生好飲。幸好他從不開車。一天,他提著酒壺,從家裡出來,酒壺中有酒兩斗。他邊走邊唱 無事街上走,提壺去打酒。逢店加一倍,遇花喝一斗。這一路上,他一共遇到店 5 次,遇到花 10 次,已知最後一次遇到的是花,他正好把酒喝光了。請你計算李白遇到店和花的次序,有多少種可能的方案。我們已知遇...