bzoj 2734 集合選數

2021-07-07 05:34:05 字數 903 閱讀 1554

構造矩陣

1 3  9  27…

2 6 18 54…

4 12 36 108…

……每個數是上面的數乘2,左面的數乘3。這樣進行狀壓dp就是相鄰的格仔不能選的方案數。

如何判斷乙個二進位制數沒有兩個連續的1? x&(x<<1)=0

如果有的數沒有出現過,就以它為左上角元素再構造乙個矩陣。

這是怎麼想到的?!!

#include

#include

#include

#include

#include

#define ll long long

#define inf 1e9

#define eps 1e-10

#define md 1000000001

#define n

using namespace std;

int a[20][15],b[20],mi[20];

ll f[20][5010];

bool vis[100010];

int n;

ll ans=1;

void add(ll &x,ll y)

void solve(int x)

else

}for (int i=1;i<=18;i++)

for (int j=2;j<=11;j++)

else

}for (int i=1;i<=18;i++)

for (int j=0;j<=b[i];j++)

f[i][j]=0;

b[0]=1; f[0][0]=1;

for (int i=0;i<18;i++)

}ans=ans*f[18][0]%md;

}int main()

BZOJ2734 集合選數

集合論與圖論 這門課程有一道作業題,要求同學們求出的所有滿足以 下條件的子集 若 x 在該子集中,則 2x 和 3x 不能在該子集中。同學們不喜歡這種具有列舉性 質的題目,於是把它變成了以下問題 對於任意乙個正整數 n 100000,如何求出 的滿足上述約束條件的子集的個數 只需輸出對 1,000,...

bzoj 2734 集合選數

written with stackedit.集合論與圖論 這門課程有一道作業題,要求同學們求出 的所有滿足以 下條件的子集 若 x 在該子集中,則 2x 和 3x 不能在該子集中。同學們不喜歡這種具有列舉性 質的題目,於是把它變成了以下問題 對於任意乙個正整數 n leq 100000 如何求出 ...

BZOJ 2734 集合選數(狀態壓縮DP)

題意 給出乙個由1到n的數字組成的集合。定義合法子集為若x在子集中則2x 3x均不能在子集中。求有多少個合法的子集。思路 1 3 9 2 6 18 4 12 36 對於上面的矩陣,我們發現就等價於不選相鄰數字的方案數。因此列舉每個還沒有用到的數字,建立以該數字為左上角的矩陣。接著就是狀態壓縮dp。i...