【問題描述】
「牽著你的手的是她,路邊開滿了紫色的百合花……」
你從夢中醒來,卻依然忘不了夢中的
她百合花,每朵百合花都有乙個權值,在二進位制下寫成一行『
1』,第
i朵紫色百合的權值在二進位制下寫成i個『
1』。你想挑出其中一些組成「一束百合花」且價值在二進位制下恰好為乙個『
1』後面p個『
0』,那麼有多少種挑選方案呢?
定義「一束百合花」的價值為這些百合花組成的集合的所有子集的權值乘積的和
(空集的權值乘積算
1)。如價值為1和
3組成的一束百合花價值為
1+1+3+1*3=8
【輸入格式】
一行兩個正整數
n,p,含義如題目中所示
n,p<=100000
【輸出格式】
乙個整數代表方案數模
998244353
的結果【樣例輸入1
】
3 3【樣例輸出1
】
2【樣例輸入2
】
233 666
【樣例輸出2
】
572514965
稍稍運用一下數學知識發現題目要求的是選出的集合每個元素
+1之後的乘積等於
2^p的方案數,取個
log就變成了↓
在
1~n選若干個數使得總和等於
p,求方案數
然後用普通的揹包
dp可以就拿到
60分了
然後我們發現,由於物品大小是
1~n,所以最多選取
o(sqrt(p))
個物品,揹包就滿了
滿分做法可以用狀態
f[i][j]
表示選i
個物品,佔容量為
j的方案數
由於每個揹包是不同的,所以根據已選的最小的物品分類討論一下:
如果最小的物品是
1,相當於
i-1個物品湊出了
j-i的大小,然後整體
+1
如果最小的物品不是
1,相當於
i個物品湊出了
j-i的大小,然後整體
+1
需要注意我們要防止出現選擇了大小為
n+1的物品的情況,所以需要減去
得到遞推式
f[i][j]=f[i-1][j-i]+f[i][j-i]-f[i-1][j-(n+1)]
時間複雜度
o(nsqrt(n))
1 #include2 #include3 #include4 #include5using
namespace
std;
6 typedef long
long
lol;
7 lol mod=998244353;8
int f[451][100011];9
lol ans;
10lol n,p;
11int
main()
1224 ans=(ans+f[i][p])%mod;25}
26 cout27 }
【問題描述】
「牽著你的手的是她,路邊開滿了紫色的百合花……」
你從夢中醒來,卻依然忘不了夢中的
她百合花,每朵百合花都有乙個權值,在二進位制下寫成一行『
1』,第
i朵紫色百合的權值在二進位制下寫成i個『
1』。你想挑出其中一些組成「一束百合花」且價值在二進位制下恰好為乙個『
1』後面p個『
0』,那麼有多少種挑選方案呢?
定義「一束百合花」的價值為這些百合花組成的集合的所有子集的權值乘積的和
(空集的權值乘積算
1)。如價值為1和
3組成的一束百合花價值為
1+1+3+1*3=8
【輸入格式】
一行兩個正整數
n,p,含義如題目中所示
【輸出格式】
乙個整數代表方案數模
998244353
的結果【樣例輸入1
】
3 3【樣例輸出1
】
2【樣例輸入2
】
233 666
【樣例輸出2
】
572514965
【資料範圍與約定】
測試點編號
n p
1≤ 8
≤
100
2 ≤
12 ≤
100 3
≤
15
≤
100
4 ≤
100≤
100 5
≤
1000 ≤
1000 6
≤
2000 ≤
2000 7
≤
100000 ≤
100000 8
≤
100000 ≤
100000 9
≤
100000 ≤
100000
10≤
100000 ≤
100000
計蒜客模擬賽5 D2T2 螞蟻搬家
很久很久以前,有很多螞蟻部落共同生活在一片祥和的村莊裡。但在某一天,村莊裡突然出現了乙隻食蟻獸,螞蟻們為了保全性命而決定搬家。然而這個村莊四面環山,想要離開這個村莊必須要從地洞裡離開,村子裡一共有 2n2n2n 個地洞,分布在山的左右,一邊 nnn 個。左邊的任意乙個地洞都可以通到右邊 nnn 個地...
計蒜客NOIP模擬賽4 D1T2小X的密室
小 x 正困在乙個密室裡,他希望盡快逃出密室。密室中有 n個房間,初始時,小 x 在 1號房間,而出口在 n號房間。密室的每乙個房間中可能有著一些鑰匙和一些傳送門,乙個傳送門會單向地創造一條從房間 x到房間 y的通道。另外,想要通過某個傳送門,就必須具備一些種類的鑰匙 每種鑰匙都要有才能通過 幸運的...
2018計蒜客初賽2
一天之後,計蒜客第二場,感覺一般般,第一題卡了一下處理的比較慢,導致後面時間略微不足,第二題倒是沒什麼坑點 思路 這題dp的味道還是挺明顯的,dp選擇當前元素所能達到的最大長度,至於轉移,第一次想的是轉移之前所有狀態中可能的狀態,然而o n 2 的複雜度,加上多組資料,毫無疑問tle 之後想到用d,...