HNOI2012 集合選數

2021-07-26 03:36:25 字數 1813 閱讀 6730

這是題目

大概就是讓你找方案數嘛。開始我還以為是一道規律題,然後有愉快地打了乙個暴搜打表。

找了十分鐘沒找出來。www.oeis.org。結果... ...

這是表

半點規律沒有。然後想了想dp,想不出線性或帶log的。

最後實在做不出來了,於是問了個大犇。大犇說這道題要用矩形。尼瑪沒在逗我。

把題目意思轉換一下嘛。就是有了x,就不能有2x和3x。

然後依大犇所言構造乙個介樣的矩形:

1

3

9

27

2

6

18

54

4

12

36

...

8

24

72

...

16

48

...

...

這樣的話就構造出乙個矩陣,滿足 a[i][j]=2*a[i-1][j]=3*a[i][j-1];

然後想起炮兵陣地這道題,狀壓dp即可求出解。

注意到這個矩陣內沒有5,7,10... ... ,即以它們為左上角的點的方案沒有算進去,於是開vis陣列。因為各個矩陣內的數字互不影響,所以用乘法原理。

**什麼的。

#include #include #include #include #include #include #define ll long long int

#define ls (x << 1)

#define rs (x << 1 | 1)

#define fa (x >> 1)

#define mid int mid=(l+r)>>1

#define max(a,b) (a>b?a:b)

#define min(a,b) (a'9' || ch<'0'))ch=getchar();

if(ch=='-')res=-1,ch=getchar();

while(ch<='9'&&ch>='0')x=(x<<3)+(x<<1)+ch-48,ch=getchar();

return x*res;

}ll calc(ll x)

} vis[a[i][1]]=1;

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

vis[a[i][j]]=1;

} }line[0]=1;

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

for(int j=0;j<(1<>1)continue;

for(int k=0,k2=1<

題解 HNOI2012 集合選數

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

集合選數 HNOI2012

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

HNOI2012 集合選數 狀壓 dp

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