loj
神仙題啊。
我們分開考慮不同的物品,按照編號與\(\sqrt n\)的關係分類。
第一類:\(i\le \sqrt n\)
即需要考慮所有的情況,那麼設\(f[i][j]\)表示前\(i\)個物品裝了體積\(j\)的方案數。
顯然\(f[i][j]=\sum_^i f[i][j-k*i]\)轉移過來,那麼按照\(i\)分剩餘類,字首和轉移即可。
這一部分的複雜度是\(o(n\sqrt n)\)
第二類:\(i\ge \sqrt n\)
因為\(i*i\ge n\),所以這一部分的任何乙個物品都不存在個數的限制,即可以隨意選擇。
那麼我們只需要用所有大於\(\sqrt n\)的數做整數劃分就行了。
設\(g[i][j]\)表示當前一共劃分出來了\(i\)個數,和為\(j\)的方案數,每次要麼加入乙個\(\sqrt n\),要麼把所有數\(+1\)。
這一部分因為數的共個數,即\(i\)不會超過\(\sqrt n\),所以總的複雜度也是\(o(n\sqrt n)\)的。
那麼這題的總複雜度就是\(o(n\sqrt n)\)了。
#include#include#includeusing namespace std;
#define ll long long
#define mod 23333333
#define max 100100
int n,m,ans;
int f[350][max],g[350][max],s[max];
int main()
for(int i=0;i<=n;++i)ans=(ans+1ll*s[n-i]*f[m][i])%mod;
printf("%d\n",ans);
return 0;
}
LOJ6089 小 Y 的揹包計數問題
傳送門 to loj 不妨分成兩部分討論 x nx sqrt x和 x n x ge sqrt n x n 為啥要這麼分啊?這確實很難說。但是我們可以猜到,我們在讓這兩個值拿到平衡 值的種類和最多選取的個數。當值的種類很少時,直接多重揹包就行了。當選取的種類很少時呢?用 f x i f x,i f ...
loj6089 小 Y 的揹包計數問題
link 好吧開學了果然忙得要死 不過為了證明我的blog還沒有涼,還是跑來更一波水題 有n種物品,第i種體積為i,問裝滿乙個大小為n的揹包有多少種方案?n leq 10 5.這種題一看就很想按根號分類是不是 設閾值大小為 m sqrt n 對於體積 leq m 的所有物品,直接跑多重揹包 f i ...
loj6089 小Y的揹包計數問題
小 y 有乙個大小為 n 的揹包,並且小 y 有 n 種物品。對於第 i 種物品,共有 i 個可以使用,並且對於每乙個 i 物品,體積均為 i 求小 y 把該揹包裝滿的方案數為多少,答案對於 23333333 取模。定義兩種不同的方案為 當且僅當至少存在一種物品的使用數量不同。這個揹包問題讓我耳目一...