JZOJ3170 挑選玩具 分治

2022-09-01 10:12:13 字數 1675 閱讀 8516

有nn

個箱子裝著m

m個玩具(乙個玩具可以在多個箱子內),求有多少種選擇箱子的方案使得每種玩具至少有乙個。設f[

i]f[

i]表示∑s1(

s&i=

s)∑s

​1(s

&i=s

),也就是選擇其中一些箱子,會得到乙個玩具集合s

s(狀壓後),如果i

i完全包含ss,f

[i]f

[i]就加一。

那麼f[ma

xn−1

−i]f

[max

n−1−

i]就是沒有乙個玩具在集合i

i中的方案數。

顯然答案就是∑s

−1∣s

∣×(2

f[ma

xn−1

−i]−

1)s∑

​−1∣

s∣×(

2f[m

axn−

1−i]

−1)對於求f

f,可以考慮使用分治。

顯然f[i]

&f[i

+mid

]=f[

i]f[

i]&f

[i+m

id]=

f[i]

,因為若f[i

]f[i

]是abc

dabc

d,則f[i

+mid

]f[i

+mid

]是1ab

cd1a

bcd這樣時間複雜度就降到了o(2

mlog⁡2

m)o(

2mlog2m)

#include

#include

using

namespace std;

typedef

long

long ll;

const

int n=

1000010

,mod=

1e9+

7,m=(1

<<20)

+10;int n,m,ans,maxn,cnt[m]

,f[m]

,power[n]

;void

work

(int l,

int r)

int mid=

(l+r)/2

;work

(l,mid)

;work

(mid+

1,r)

;for

(int i=l;i<=mid;i++

) f[i-l+mid+1]

+=f[i];}

intmain()

cnt[s]++;

}work(0

,maxn-1)

; power[0]

=1;for

(int i=

1;i<=n;i++

) power[i]

=power[i-1]

*2%mod;

cnt[0]

=1;for

(int i=

0;i)printf

("%d\n"

,(ans%mod+mod)

%mod)

;return0;

}

3 17學習計畫

1 做一套計算機二級的題目 2 背英語單詞,記筆記 4 做模電作業,課堂檢測和課後作業 1 和往常一樣,空閒的時候,在手機上做了選擇題 有電腦的時候,直接做大題。做了很多題目之後,現在對word算是比較熟悉了,基本上首先是要看是另存為,還是以什麼名字儲存。其次基本上都要調整頁面大小,頁邊距這些。當然...

3 17考試小記

考場上來讀完第一題第一反應就是網路流,看上去應該是乙個最小割或者費用流。第二題看上去好像是一道傳統計數題,可能要n 2遞推 組合數或者容斥可能會很麻煩。第三題題面很長,讀完發現就是一道lct維護子樹資訊,而且細節很多,很毒瘤。但是部分分給的很多,但是種類有點多,貌似每乙個部分分都不那麼好打,而且最後...

藍橋杯練習 3 17

旅行家的預算 貪心 問題描述 乙個旅行家想駕駛汽車以最少的費用從乙個城市到另乙個城市 假設出發時油箱是空的 給定兩個城市之間的距離d1 汽車油箱的容量c 以公升為單位 每公升汽油能行駛的距離d2 出發點每公升汽油 p和沿途油站數n n可以為零 油站i離出發點的距離di 每公升汽油 pi i 1,2,...