Loj 6703 小Q的序列

2022-05-20 04:48:09 字數 1173 閱讀 6234

考慮樸素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 和巧克力...