模擬賽 斯特林數計數 題解(拉格朗日插值)

2021-09-27 13:45:03 字數 2264 閱讀 3321

題目大意:

答案對\(10^9 + 7\)取模。

首先,我們發現

設r=r可以矩陣乘法求。

根據斯特林數的

原式可化為

設所求為\(f_k(n)\)。

對於\(r=1\)的情況,自然數冪求和即可。\(o(k+logn)\)。

所以,

由上述暴力展開的情況可以發現,存在乙個關於\(n\)的\(m\)次多項式\(f_m(n)\),

使得\(f_m(n)=f_m(n)r^-f_m(0)r\),利用上述的展開方式也可歸納證明這個結論。

所以,求出\(f_m(n)\)即可,由於它是\(m\)次多項式,所以,求出\(f_m(0)到f_m(m)\)即可插值求出\(f_m(n)\)。

因為\(f_m(n)-f_m(n-1)=f_m(n)r^-f_m(n-1)r^n=n^m r^n\),所以\(f_m(n)r-f_m(n-1)=n^m\),

即\(f_m(n)=\frac\)。

設\(f_m(0)=x\),那麼\(f_m(i)\)就能表示為\(k_ix+b_i\)的形式。

那麼,我們只要再找一條\(f_m\)的等量關係即可求出。

代入到上一條式子,即可得出

(其實就是說m次多項式的m+1次差分等於0,這條式子可以保證\(f_m\)形成乙個m次多項式)。

這樣,我們就能求出\(f_m(0)到f_m(m)\),再通過插值,即可求出\(f_m(n)\),進而求出答案。

通過線性篩,可以在計算質數\(p\)的\(p^m\)後線性地算出所有正整數\(x\)的\(x^m\)。

時間複雜度為\(o(\frac*log_2(m))=o(m)\)。

總時間複雜度\(o(k+logn)\)。

**:

#include #define md 1000000007

#define ll long long

int ny[200010],jc[200010],jn[200010];

int c(int n,int m)

int ksm(int a,int b)

return jg;

}int getfib(ll x)

for(int i=s-1;i>=0;i--)

}return c;

}int qz[200010],hz[200010];

int jisuan(int sz[200010],int n,ll x)

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

int ans=0;

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

}}int main()

yucl(k+1,k);

int r=(getfib(r+2)-1+md)%md;

if(r==1)

else

int hk=0,hb=0;

for(int i=0;i<=k+1;i++)

f[0]=1ll*(md-hb)*ksm(hk,md-2)%md;

for(int i=1;i<=k;i++)

f[i]=(1ll*k[i]*f[0]+b[i])%md;

int fn=jisuan(f,k,n);

int ans=1ll*fn*ksm(r,(n+1)%(md-1))%md;

ans=(ans-1ll*f[0]*r%md+md)%md;

printf("%d\n",ans);

}fclose(stdin);

fclose(stdout);

return 0;

}

斯特林數 斯特林反演

第一類stirling數 s n,m 也可記為 beginn m end 第一類stirling分為無符號第一類stirling數 s u n,m 和帶符號第一類stirling數 s s n,m 他們分別表現為其公升階函式和降階函式的各項係數,形式如下 x x cdot x 1 cdot x 2 ...

數學 斯特林子集數 斯特林輪換數 尤拉數

斯特林子集數 第二類斯特林數 從把n個不同的小球放到k個相同的盒子裡,且每個盒子至少要有乙個小球的選法。快速計算一行斯特林數 使用這個式子 frac sum limits m 1 i binom m i n 把上式變形 frac sum limits m 1 i frac m i n sum lim...

斯特林數(Stirling)

第一類斯特林數表示的是將n個不同元素分成k個不同的環的方案數。兩個環不相同當且僅當這兩個環不能通過旋轉得到。記作s n,k 遞推關係的說明 1.考慮第n個物品,n可以單獨構成乙個非空迴圈排列,這樣前n 1種物品構成k 1個非空迴圈排列,方法數為s n 1,k 1 2.也可以前n 1種物品構成k個非空...