構造矩陣
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...