題目傳送門
直接看題面吧。
感覺挺水的一道題啊?怎麼評到紫色的啊?考試的時候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 題吖.我最開始想這題的時候畫了乙個如下的圖.對於每乙個點,左兒子是它的兩倍,右兒子是它的三倍.約束條件是 連了邊的兩個點是不可以同時選的,也就是只能隔乙個...