1. 程式人生 > >[Luogu P4389] 付公主的揹包

[Luogu P4389] 付公主的揹包

洛谷傳送門

題目描述

這個揹包最多可以裝 1 0 5 10^5 大小的東西

付公主有 n n

種商品,她要準備出攤了

每種商品體積為 V i V_i ,都有 1 0 5

10^5

給定 m m ,對於 s [ 1

, m ] s\in [1,m] ,請你回答用這些商品恰好裝 s s 體積的方案數

輸入輸出格式

輸入格式:

第一行 n , m n,m

第二行 V 1 V n V_1\sim V_n

輸出格式:

m m 行,第 i i 行代表 s = i s=i 時方案數,對 998244353 998244353 取模

輸入輸出樣例

輸入樣例#1:

2 4
1 2

輸出樣例#1:

1
2
2
3

說明

對於30%的資料, n 3000 , m 3000 n\le 3000,m\le 3000

對於60%的資料,純隨機生成

對於100%的資料, n 100000 , m 100000 n\le 100000,m\le 100000

對於100%的資料, V i m V_i\le m

解題分析

對於一個體積為 V i V_i 的物品, 其生成函式為 1 + x V i + x 2 V i + . . . + x k V i = 1 1 x V i 1+x^{V_i}+x^{2V_i}+...+x^{kVi}=\frac{1}{1-x^{V_i}} 。那麼很顯然我們就是要快速求所有生成函式的積, 找到對應項的係數即可。

關鍵是如何快速求這個玩意。 有個很套路的做法是先把這玩意求 l n ln 加上再 e x p exp 回去。

那麼開始推式子: 設 f ( x ) f(x) 為第 i i 個物品的生成函式, g ( x ) = l n ( f ( x ) ) g(x)=ln(f(x)) , 那麼有:
g ( x ) = f ( x ) f ( x ) = k 1 k V i x k V i 1 1 1 x V i = ( 1 x V i ) k 1 k V i x k V i 1 = k 1 V i x k V i 1 g ( x ) = k 1 1 k x k V i g'(x)=\frac{f'(x)}{f(x)} \\ =\frac{\sum_{k\ge 1}kV_ix^{kV_i-1}}{\frac{1}{1-x^{V_i}}} \\ =(1-x^{V_i})\sum_{k\ge 1}kV_ix^{kV_i-1} \\ =\sum_{k\ge 1}V_ix^{kV_i-1} \\ g(x)=\sum_{k\ge 1}\frac{1}{k}x^{kV_i}
所以這玩意記錄一下出現次數可以 O ( N l n ( N ) ) O(Nln(N)) 求。

那麼剩下的就是一個 e x p exp 的板子辣!

程式碼如下:

#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cctype>
#include <algorithm>
#include <cstring>
#define R register
#define IN inline
#define W while
#define gc getchar()
#define MX 600500
#define MOD 998244353
#define g 3
#define ginv 332748118
template <class T>
IN void in(T &x)
{
	x = 0; R char c = gc;
	for (; !isdigit(c); c = gc);
	for (;  isdigit(c); c = gc)
	x = (x << 1) + (x << 3) + c - 48;
}
IN int fpow(R int base, R int tim)
{
	int ret = 1;
	W (tim)
	{
		if (tim & 1) ret = 1ll * ret * base % MOD;
		base = 1ll * base * base % MOD, tim >>= 1;
	}
	return ret;
}
int a1[MX], a2[MX], b1[MX], b2[MX], b3[MX], b4[MX], c[MX];
int inv[MX], A[MX], rev[MX], res[MX]
            
           

相關推薦

[Luogu P4389] 公主揹包

洛谷傳送門 題目描述 這個揹包最多可以裝 1 0 5

P4389 公主揹包

傳送門 還是搞不明白生成函式是什麼東西…… 首先設對於體積為\(v\)的物品,它的生成函式為\(f(x)=\sum_{i\geq 0} x^{vi}\),那麼答案的生成函式就是所有的物品的生成函式的乘積,複雜度為\(O(nm\log n)\) 於是考慮把所有生成函式取\(\ln\)相加再\(\exp\)

洛谷 P4389 公主揹包 解題報告

P4389 付公主的揹包 題目背景 付公主有一個可愛的揹包qwq 題目描述 這個揹包最多可以裝\(10^5\)大小的東西 付公主有\(n\)種商品,她要準備出攤了 每種商品體積為\(V_i\),都有\(10^5\)件 給定\(m\),對於\(s\in [1,m]\),請你回答用這些商品恰好裝\(

洛谷 P4389: 公主的背包

floor lin pla 生成 spl display lld 需要 aligned 題目傳送門:洛谷 P4389。 題意簡述: 有 \(n\) 個物品,每個物品都有無限多,第 \(i\) 個物品的體積為 \(v_i\)(\(v_i\le m\))。 問用這些物品恰好裝滿

Luogu4389.公主揹包

題意: 付公主有一個可愛的揹包qwq 這個揹包最多可以裝 105 10 5 10^5 大小的東西 付公主有 n

luoguP4389 公主揹包 多項式exp

%%%dkw 話說這是個論文題來著... 考慮生成函式\(OGF\) 對於價值為\(v\)的物品,由於有\(10^5\)的件數,可以看做無限個 那麼,其生成函式為\(x^0 + x^{v} + x^{2v} + ... = \frac{1}{1 - x^v}\) 我們所需的答案即\([x^n

LuoguP4389 公主揹包【生成函式+多項式exp】

題目背景 付公主有一個可愛的揹包qwq 題目描述 這個揹包最多可以裝10^5105大小的東西 付公主有n種商品,她要準備出攤了 每種商品體積為Vi,都有10^5105件 給定m,對於s\in [1,m]s∈[1,m],請你回答用這些商品恰好裝s體積的方案數 輸入輸出格式 輸入格式: 第一行n

luoguP4389 公主揹包 多項式求逆 多項式求ln 多項式求exp 生成函式

luoguP4389 付公主的揹包 題目傳送門 分析 神仙題系列。。。 首先寫出每件商品的生成函式,假設體積為 V V

公主的矩形

n) scanf amp AI ref ble 對數 scan AR 題鏈 我們註意給定n*m的矩形,直線穿過的點為 n+m-gcd(n,m); n+m=k+gcd(n,m); 故 gcd(n,m)| k 且 n/gcd(n,m)+m/gcd

公主的背包

new 背包 HR show blog http post blank pos 題鏈 這是重題啦。 真*題解·付公主的背包

LUOGU P5061 祕密任務(揹包+二分圖染色)

傳送門 解題思路   \(orz\)出題人的神仙做法。本蒟蒻看不懂,就水個求補圖再二分圖染色的方法來\(%1%\)出題人。      首先我們對圖中\(m\)個關係連邊,發現這樣是沒法做的,因為我們最後要關注的是誰和誰不能在一起,這個限制是比較大的。所以我們考慮建一個補圖,就是把原來沒有的邊加邊,原來存

題解 P4388 【公主的矩形】

嗯, 額, 這個, 不太好組織開頭語,直接說題吧。 一個任性又喜新厭舊的她箭術過人,以稻草人練習。 需要滿足她的喜新厭舊,一~~發入~~箭穿心 n 個稻草人。 得到方案數。 關於題解: 三步走 壹:look it:  可知: 若 gcd(i,n)=i ,為一種方案,ans+

[luogu4389]公主的背包(FFT)

put code pro 背包 space stdin size 計數問題 pen 完全背包方案計數問題的FFT優化。首先寫成生成函數的形式:對重量為V的背包,它的生成函數為$\sum\limits_{i=0}^{+\infty}x^{Vi}=\frac{1}{1-x^{V

【LGP4389】公主的背包

pre span times main spl 題目 math 一點 inline 題目 退役前抄一道生成函數快樂一下 就是讓我們做一個完全背包,但是樸素的做法顯然是\(O(nm)\)的 把每一個物品搞成一個多項式,顯然這個多項式所有\(v_i\)的倍數箱為\(1\),剩下

luoguP4389 公主的背包

algorithm 代碼 sdi n+1 gis oid org tchar turn luogu 顯然這是個背包題 顯然物品的數量是不用管的 所以考慮大小為\(v\)的物品可以裝的體積用生成函數表示一下 \[ f(x)=\sum_{i=0}^{+\infty}x^{vi

luogu P2170 選學霸 並查集+揹包

傳送門 比較簡單的題 並查集維護一下必須選擇的大小 也就是物品 然後0/1揹包處理指定體積能否組成 (一開始開bool想做一個傳遞真值就是D不出來....能有dalao講一下嗎) Code: 1 #include<cstdio> 2 #include<c

LUOGU P4394 [BOI2008]Elect 選舉 (揹包)

傳送門 解題思路   一眼看上去就像個揹包,然後就是\(0/1\)揹包改一改,結果發現過不了樣例。後來想了一下發現要按\(a\)從大到小排序,因為如果對於一個>=總和的一半但不滿足的情況來說,把最小的去掉也一定>=總和的一半。 #include<iostream> #incl

[luogu U54181] 【NOIP 考後歡樂賽】 Mr.Lee 的評測機{01揹包}

題目 https://www.luogu.org/problemnew/show/U54181 解題思路 很明顯,評測機評測次數越多就越好,所以這就是一個01揹包。對於每組資料,就判斷一下算出來的最大評測次數是否達到當前的評測點的應評測次數,累加即可。 程式碼

bzoj 1334: [Baltic2008]Elect(luogu 4394)貪心+01揹包

演算法:貪心+01揹包 難度:NOIP 首先,我們對讀入的n個數從大到小排序,這樣可以儘可能保證拿走“某個政黨退出後,其它黨的席位仍大於總 數的一半”,然後列舉的時候從sum/2開始就好啦! 學

luogu P1809 過河問題_NOI導刊2011提高(01)

-m iostream style 人才 三次 nbsp code mat 問題 題目描述 有一個大晴天,Oliver與同學們一共N人出遊,他們走到一條河的東岸邊,想要過河到西岸。而東岸邊有一條小船。 船太小了,一次只能乘坐兩人。每個人都有一個渡河時間T,船劃到對