【題意
】:
\color
【題意】
:《集合論與圖論》
這門課程有一道作業題,要求同學們求出
\的所有滿足以 下條件的子集:若 x
xx 在該子集中,則 2x2x
2x和 3x3x
3x不能在該子集中。
同學們不喜歡這種具有列舉性質的題目,於是把它變成了以下問題:對於任意乙個正整數 1≤n
≤1×1
05
1 \leq n \leq 1\times 10^5
1≤n≤1×
105,如何求出
\的滿足上述約束條件的子集的個數(只需輸出對 1
,000
,000
,001(1
×109
+1
)1,000,000,001(1 \times 10^9+1)
1,000,
000,
001(
1×10
9+1)
取模的結果),現在這個問題就 交給你了。
【 思路
】:
\color
【思路】
: 一道構造
+狀壓dp
的好題目。
我們可以構造這麼乙個矩陣,第1
11行第1
11個數是1
11,其後,每行的第j
jj個元素是該行第j−1
j-1j−
1個數的3
33倍,每列的第i
ii個數是該列的第i−1
i-1i−
1個數的2
22倍。比如這樣:
139
2781...
261854
162...
41236108
324.
..
然後,問題就變成了在這個矩陣中選數,且相鄰的數不能同時選的方案數。
考慮到其行數和列數不是很大,所以我們可以用狀壓dp
輕鬆解決。
記第i
ii行的數取或不取的狀態用0,1
0,10,
1表示,fi,
jf_
fi,j
表示第i
ii行狀態為j
jj時的答案。轉移具體看**。
注意因為從1
11開始構造矩陣不能把所有的數包含在內,需要把所有可能的矩陣構造出來,然後根據乘法原理,答案相乘即可。
【 程式碼
】:
\color
【程式碼】
:
const ll mod=
1000000001
;const
int n=
100100
,m=20
;ll line[m]
,f[2][
1<<18]
,n;bool chose[n]
,g[(
1<<18)
+5];
int a[m]
[m],lim[m]
;ll ans=
1ll,t;
inline
void
initialization()
//預處理g陣列(g[i]:i是否為可行集合)
inline
void
make_rectangle
(int x)
lim[i]=(
1<1;}}
//以x為首個數字構造我們需要的矩陣
inline ll dp()
register ll res=
0ll;
for(i=
0;i<=lim[t]
;i++)if
(g[i]
) res=
(res+f[t&1]
[i])
%mod;
return res;
}//狀壓dp求解子問題
intmain()
printf
("%lld"
,ans)
;return0;
}
2020 02 12日常總結兼狀壓dp略講(上)
狀壓dp是一種很重要的dp text dp,其基本思路是利用二進位制,簡化我們狀態的定義。為了更好的理解狀壓,我們需要先來看看c 中的二進位制運算 今天,我們就講到這裡,明天我們再講。題目 鏈結 題目鏈結 題目鏈結 思路 color 思路 記f i j,k f i,j,k f i,j,k 表示第i ...
2019 08 18 日常總結
一本通1599 題意 在一年前贏得了小鎮的最佳草坪比賽後,fj 變得很懶,再也沒有修剪過草坪。現在,新一輪的最佳草坪比賽又開始了,fj 希望能夠再次奪冠。然而,fj 的草坪非常髒亂,因此,fj 只能夠讓他的奶牛來完成這項工作。fj 有 nn 只排成一排的奶牛,編號為 11 到 nn。每只奶牛的效率是...
5059日常總結
1.乙個函式的形參是const char 實參是可以是char 如果乙個函式的返回值是const char 不能用char 來接收返回值 2.為什麼沒有靜態的建構函式和析構函式?建構函式成員函式使用現有分配構造指定的物件 即存在this。static成員函式指定物件沒有儲存,因此沒有關聯的例項要構造...