HNOI2012 集合選數(狀壓DP 構造)

2022-05-19 20:26:23 字數 1180 閱讀 3879

題目要求若出現x,則不能出現2x,3x

所以我們考慮構造乙個矩陣

\(1\ 2\ 4 \ 8……\)

\(3\ 6\ 12\ 24……\)

\(9\ 18\ 36……\)

\(……\)

不難發現,對於乙個矩陣,若我選擇了乙個數x,則在矩陣內該數的相鄰格仔都不能選,題目就被轉化成了玉公尺田了,可以用狀壓dp解決

但是直接做是不對的,比如5就沒有出現在這個序列中

所以我們可以構造多個矩陣,用乘法原理統計答案即可

#includeusing namespace std;

#define il inline

#define re register

#define debug printf("now is line : %d\n",__line__)

#define file(a) freopen(#a".in","r",stdin);//freopen(#a".out","w",stdout)

#define int long long

#define inf 123456789

#define mod 1000000001

il int read()

while(c >= '0' && c <= '9') x = x * 10 + c - 48, c = getchar();

return x * f;

}#define rep(i, s, t) for(re int i = s; i <= t; ++ i)

#define drep(i, s, t) for(re int i = t; i >= s; -- i)

#define mem(k, p) memset(k, p, sizeof(k))

#define maxn 100005

int n, m, a[20][20], g[1 << 15], vis[maxn], h, l[20], dp[20][1 << 15], ans = 1;

il void martix(int x)

}}il int solve() }}

int t = 0;

rep(i, 0, (1 << l[h]) - 1) t = (t + dp[h][i]) % mod;

return t;

}signed main()

HNOI2012 集合選數 狀壓 dp

求對於正整數 n leq 1e5 的滿足約束條件 若 x 在該子集中,則 2x 和 3x 不在該子集中.的子集個數.是一道很妙的構造 狀壓 dp 題吖.我最開始想這題的時候畫了乙個如下的圖.對於每乙個點,左兒子是它的兩倍,右兒子是它的三倍.約束條件是 連了邊的兩個點是不可以同時選的,也就是只能隔乙個...

HNOI2012 集合選數

這是題目 大概就是讓你找方案數嘛。開始我還以為是一道規律題,然後有愉快地打了乙個暴搜打表。找了十分鐘沒找出來。www.oeis.org。結果.這是表 半點規律沒有。然後想了想dp,想不出線性或帶log的。最後實在做不出來了,於是問了個大犇。大犇說這道題要用矩形。尼瑪沒在逗我。把題目意思轉換一下嘛。就...

題解 HNOI2012 集合選數

題目傳送門 直接看題面吧。感覺挺水的一道題啊?怎麼評到紫色的啊?考試的時候ljs出了這個題的加強版我就只想出這個思路,然後就爆了。不難發現,我們可以構造矩陣 x 2x 4x 6x 3x 6x 12x 24x 48x 9x 18x 36x 然後實際上就相當於在這個矩陣中選出一些數使得兩兩不相鄰。因為行...