給定 \(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 可以肯定,無論從最左邊還是從最右邊看,最高的那個樓一定是可以看到的.假設最高的樓的位置固定,最高樓的...