description
求出集合中,滿足:
諾x在該集合中,2x與3x不在集合。
的所有子集的個數。對答案mod 1000000001。
題解這個題目很要思維了,反正我沒想出來,但看了題解十分佩服。
我們構造乙個矩陣,x3x
9x..3j
x
2x6x
18x..
....
....
....2i
x ..
....2i
3jx
可以發現,滿足要求的子集必須滿足乙個條件,就是從矩陣中取出的任意兩個數不能相鄰。因為n<=100000,所以矩陣是大約18×11的,所以我們可以用狀態壓縮的dp來解決。
f[i][j]為到第1行,第i行狀態為j(二進位制)中可行的子集數量,那麼
f[i][j]+=f[i-1][k]; (j&k)=0&&(j&(j>>1))=0
f[0][0]=1;
其中j&k=0代表上下兩行沒有相鄰的元素,(j&(j>>1))=0表示第i行沒有左右相鄰的元素。
就這樣,可以求出乙個矩陣的所以情況。
可是,x為1時,並不能包含所以1到n的數,我們需要列舉沒被包含再內的數作為x重新構造矩陣,將所以矩陣的答案乘起來。
#include
#include
#include
#include
#include
#define maxn 100000+10
#define ll long long
#define mod 1000000001
using
namespace
std;
int vis[maxn],n,a[20][20],b[20],f[20][maxn];
ll ans;
int cal(int x)
int main()
bzoj2734 HNOI2012 集合選數
time limit 10 sec memory limit 128 mb submit 831 solved 487 submit status discuss 集合論與圖論 這門課程有一道作業題,要求同學們求出的所有滿足以 下條件的子集 若 x 在該子集中,則 2x 和 3x 不能在該子集中。同...
bzoj2734 HNOI2012 集合選數
time limit 10 sec memory limit 128 mb submit 889 solved 523 submit status discuss description 集合論與圖論 這門課程有一道作業題,要求同學們求出的所有滿足以 下條件的子集 若 x 在該子集中,則 2x 和 ...
bzoj2734 HNOI2012 集合選數
題目鏈結 集合論與圖論 這門課程有一道作業題,要求同學們求出的所有滿足以 下條件的子集 若 x 在該子集中,則 2x 和 3x 不能在該子集中。同學們不喜歡這種具有列舉性 質的題目,於是把它變成了以下問題 對於任意乙個正整數 n 100000,如何求出 的滿足上述約束條件的子集的個數 只需輸出對 1...