題解 HNOI2012 集合選數

2022-05-01 19:27:14 字數 1059 閱讀 4510

題目傳送門

直接看題面吧。

感覺挺水的一道題啊?怎麼評到紫色的啊?考試的時候ljs出了這個題的加強版我就只想出這個思路,然後就爆了。。。

不難發現,我們可以構造矩陣:

x 2x 4x 6x ... 

3x 6x 12x 24x 48x ...

9x 18x 36x ...

然後實際上就相當於在這個矩陣中選出一些數使得兩兩不相鄰。因為行數列數都是 \(\log\) 級別的,所以直接狀壓就好了。

#include using namespace std;

#define int register int

#define mod 1000000001

#define maxn 1000005

template void read (t &x)

template void read (t &x,args& ... args)

template void write (t x)

template void mx (t &a,t b)

template void mi (t &a,t b)

bool mark[maxn];

int n,a[25][25],lim[25];

void init (int x)

} for (int j = 1;j <= lim[i];++ j) mark[a[i][j]] = 1;

}} bool chk[1 << 21];

int dp[2][1 << 22];

int workdp ()

for (int s = 0;s < (1 << lim[i]);++ s) if (chk[s])

else dp[i & 1][s] = 0;

} int ans = 0;

for (int s = 0;s < (1 << lim[endl]);++ s) ans += dp[endl & 1][s],ans %= mod;

return ans;

}signed main()

HNOI2012 集合選數

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

集合選數 HNOI2012

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

HNOI2012 集合選數 狀壓 dp

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