考慮樸素dp。
\[f_ = f_ + f_*(j+a_i)
\]稍微轉換一下下標:
\[f_ = f_ + (a_i+i-\delta)f_
\]拆組合意義:
乙個位置上乘了 \(a_i+i\) 的話代表這個位置不選,並且有 $a_i+i $ 的貢獻。
然後對於剩下的 \(n\) 個數, 答案是 \(\sum g_\) 。
其中 \(g\) 的轉移:
\[g_ = g_ -j * g_
\]為了方便稍微改一下,\(g_i = g_i * (-1)^i\) 。新的轉移是:
\[g_ = -g_ +j * g_
\]新的 dp 的組合意義是 \(i\) 個數分成 \(j\) 組的方案數,每一組有乙個 \(-1\) 的貢獻。
考慮 \(g_\) 的 egf :
\[\frac
\]然後一列相當於是可以選任意個,那麼就是:
\[\large e^
\]前面可以分治 fft,複雜度 \(o(n\log^2 n)\)。
**
#includeusing namespace std;
const int n=5e5+5;
typedef long long ll;
const int mod=998244353;
int add(int a,int b)
int sub(int a,int b)
int mul(int a,int b)
int qpow(int a,int b)
/*math*/
namespace template_polyreturn ntt(divide(l,mid),divide(mid+1,r));
}poly a,b;
int main()
a=divide(1,n);
b.resize(n+2);
for(int i=1,_f=1;i<=n+1;i++)
b=exp(b);
for(int i=1,f=1;i<=n;i++)
int ans = 0;
for(int i=0;i<=n;i++)
cout << sub(ans,1) << endl;
}
小Q的最小值序列
1.題目描述 小 q 得到了乙個長度為 n 的序列 a,a 中的數各不相同。對於 a 中的每乙個 數 ai,求 min 1 j2.問題分析 1.暴力破解的代價太大。進一步考慮,如果輸入序列有序,那麼每次檢索比較的範圍可以縮小到三個數之間 2.問題要求輸出相應pi的值,則選用陣列等資料結構不可取,需要...
貪吃的小q
牛客題目 小q的父母要出差n天,走之前給小q留下了m塊巧克力。小q決定每天吃的巧克力數量不少於前一天吃的一半,但是他又不想在父母回來之前的某一天沒有巧克力吃,請問他第一天最多能吃多少塊巧克力 輸入描述 每個輸入包含乙個測試用例。每個測試用例的第一行包含兩個正整數,表示父母出差的天數n n 50000...
貪吃的小Q
小q的父母要出差n天,走之前給小q留下了m塊巧克力。小q決定每天吃的巧克力數量不少於前一天吃的一半,但是他又不想在父母回來之前的某一天沒有巧克力吃,請問他第一天最多能吃多少塊巧克力 輸入描述 每個輸入包含乙個測試用例。每個測試用例的第一行包含兩個正整數,表示父母出差的天數n n 50000 和巧克力...