BZOJ2734 HNOI2012 集合選數

2021-08-02 08:58:19 字數 1004 閱讀 8832

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...