计蒜客NOIP模拟赛(2) D2T2紫色百合
【問題描述】
?
“牽著你的手的是她,路邊開滿了紫色的百合花……”
?
你從夢中醒來,卻依然忘不了夢中的她百合花,每朵百合花都有一個權值,在二進制下寫成一行‘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 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 typedef long long lol; 7 lol Mod=998244353; 8 int f[451][100011]; 9 lol ans; 10 lol n,p; 11 int main() 12 {lol i,j; 13 cin>>n>>p; 14 f[0][0]=1; 15 for (i=1;i*(i+1)/2<=p;i++) 16 { 17 for (j=i;j<=p;j++) 18 { 19 f[i][j]=f[i-1][j-i]+f[i][j-i]; 20 if (j>=(n+1)) f[i][j]-=f[i-1][j-n-1]; 21 if (f[i][j]<0) f[i][j]+=Mod; 22 if (f[i][j]>=Mod) f[i][j]-=Mod; 23 } 24 ans=(ans+f[i][p])%Mod; 25 } 26 cout<<ans%Mod; 27 }?
?
?
?
?
【問題描述】
“牽著你的手的是她,路邊開滿了紫色的百合花……”
你從夢中醒來,卻依然忘不了夢中的她百合花,每朵百合花都有一個權值,在二進制下寫成一行‘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 |
?
轉載于:https://www.cnblogs.com/Y-E-T-I/p/7496356.html
總結
以上是生活随笔為你收集整理的计蒜客NOIP模拟赛(2) D2T2紫色百合的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 价值12万美元的香蕉,最终被美国艺术家吃
- 下一篇: 算法学习之快速排序的C语言实现