洛谷P5408 第一類斯特林數 行

2022-06-19 19:21:11 字數 2232 閱讀 6513

給定 \(n(1\leq n\le 262144)\) ,對於所有的整數 \(i\in [0,n]\),求出 \( \pmod\)

考慮第一類斯特林數的生成函式

\[\sum_^x^k=x^}

\]其中生成函式的 \(k\) 次項的係數就是我們要求的第一類斯特林數。

考慮倍增。

\[x^}=x^}(x+n)^}\\

\]記\(f(x)=x^}\)。假設我們已經知道了 \(f(x)\),如何去求出 \(f(x+n)=(x+n)^}\)。

令 \(a_i=[x^i]f(x)\),即 \(a_i\) 是多項式 \(f(x)\) 的第 \(i\) 項前的係數。那麼

\[f(x)=\sum_^a_ix^i\\

f(x+n)=\sum_^a_i(x+n)^i=\sum_^a_i\sum_^i\binomx^jn^\\

=\sum_^x^j\sum_^\binoma_in^=\sum_^x^j\sum_^a_in^\frac\\

=\sum_^\frac\sum_^a_ii!\frac}\\

\]記 \(a(i)=a_ii!,b(i)=\frac\),則

\[f(x+n)=\sum_^\frac\sum_^a(i)b(i-j)=\sum_^\frac\sum_^a(i+j)b(i)\\

\]記 \(a'(x)=a(n-x)\) 為 \(a(x)\) 的翻轉多項式,則

\[f(x+n)=\sum_^\frac\sum_^a'(n-j-i)b(i)

\]顯然這是乙個卷積形式。而模數 \(167772161\) 是乙個 ntt 模數,所以我們可以使用 ntt 以 \(o(n\log n)\) 的時間複雜度求出 \(f(x+n)\),然後再和 \(f(x)\) 進行一次多項式乘法即可求出 \(x^}\)。

根據主定理,有

\[t(n)=t(\frac)+o(n\log n)=o(n\log n)

\]因此時間複雜度為 \(o(n\log n)\)。

#include using namespace std;

#define rg register int

#define ll long long

const ll mod = 167772161ll;

const int maxn = 262144;

ll inv[maxn + 5], fact[maxn + 5], finv[maxn + 5];

void init()

return;

}ll expow(ll b, ll n, ll mod)

return x;

}int r[maxn + 5];

int l, limit;

const ll p = 167772161, g = 3, gi = 55924054;

void ntt(ll* a, int type) }}

}void convolution(ll* a, int n, ll* b, ll m, ll* c)

ntt(a, 1); ntt(b, 1);

for (int i = 0; i < limit; i++) a[i] = (a[i] * b[i]) % p;

ntt(a, -1);

ll inv = expow(limit, p - 2, p);

for (int i = 0; i <= n + m; ++i)

c[i] = a[i] * inv % p;

}ll a[maxn + 5], b[maxn + 5], c[maxn + 5];

void stirlingi(int n)

int m = n >> 1;

stirlingi(m);

ll mi = 1;

for (int i = 0;i <= m;++i)

convolution(a, m, b, m, a);

for (int i = 0;i <= m;++i)

b[i] = finv[i] * a[m - i] % mod;

convolution(b, m, c, m, c);

if (n % 2 == 0) return;

c[n] = 0;

for (int i = n;i >= 1;--i)

c[i] = (c[i - 1] + (ll)(n - 1) * c[i] % mod) % mod;

c[0] = 0;

return;

}int main()

Luogu P5408 模板 第一類斯特林數 行

為什麼要做這題呢,當然是有用啊qwq 首先我們考慮非常經典的式子 x sum i left n i right x i 然後上倍增 x x x n 相當於我們已經有了乙個多項式 f x 現在要求另乙個多項式 f x c f x c sum i f i x c i sum i x i sum j f ...

求第一類斯特林數的一行

考試時太弱了不會。結果被吊起來打。學習了一下zzd的部落格。首先 o left n 2 right 的遞推十分簡單。但是不夠快,根據 x sum n left n atop k right x k 可以得出 o left n log 2n right 的分治fft,但是不夠快,於是可以倍增地搞。就是...

HDOJ 4372 第一類斯特林數

有一系列的樓房,高度從1 n,然後從左側看能看到f個樓房,右側看能看到b個樓房,問有多少個方案數滿足。首先我們知道乙個結論 n的環排列的個數與n 1個元素的排列的個數相等,因為p n,n n n 1 可以肯定,無論從最左邊還是從最右邊看,最高的那個樓一定是可以看到的.假設最高的樓的位置固定,最高樓的...