日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

蛋糕(卡特兰数)

發(fā)布時(shí)間:2025/3/21 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 蛋糕(卡特兰数) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題目描述


輸入格式

一行兩個(gè)整數(shù) n 和 P, 意義如題面所示。

輸出格式

一行一個(gè)整數(shù), 表示有多少種切法。

輸入樣例

【樣例一輸入】
6 1000000007

輸出樣例

【樣例一輸出】
14

題解:

?????? 我們用f[i-2]來(lái)表示將凸i邊形劃分的方案數(shù),那么我們?cè)O(shè)一個(gè)凸n邊形的頂點(diǎn)順時(shí)針順序依次為p1,p2……pn,顯然p1和pn相鄰?,F(xiàn)在我們選點(diǎn)pk,(k不為1和n),那么p1,pn,pk會(huì)把圖形分成兩部分+p1pnpk這個(gè)三角形,特殊的,當(dāng)k=n-1或k=2時(shí),我們把它看成分成了一個(gè)n-1邊形和一個(gè)0邊形。又因?yàn)?邊形無(wú)法劃分,我們暫定f[0]=1(表示0邊形的劃分?jǐn)?shù))。且由常識(shí)可知f[1]=1。

?????? 現(xiàn)在我們就可以得出遞推式:f[i-2]=f[0]*f[i-3]+f[1]*f[i-4]+……+f[i-3]*f[0];由此可觀察出這就是我們所熟悉的卡特蘭數(shù),求n邊形的劃分方案,就是求卡特蘭數(shù)的第n-2項(xiàng)。

?????? 在這里先介紹一下卡特蘭數(shù)的數(shù)學(xué)遞推式:

???? ? h(n)=C(2n,n)/(n+1)??? h(n)=h(n-1)*(4*n-2)/(n+1); ? h(n)=c(2n,n)-c(2n,n-1)

?????? 接下來(lái)就好簡(jiǎn)單啦,不就求第n-2項(xiàng)嗎?

?????? 等等,真的簡(jiǎn)單嗎?對(duì)于本題,n<=10,000,000,而且mod的p還不是質(zhì)數(shù)!!!

?????? 假如我們質(zhì)因數(shù)分解,用最小表示法處理f[n-2],時(shí)間復(fù)雜度高達(dá)O(nlogn),所以我們必須找更優(yōu)的方法。

?????? 我們的最終目的是用最小表示法表示f[n-2],那么我們只需知道每個(gè)質(zhì)數(shù)出現(xiàn)的個(gè)數(shù)就ok了。比如質(zhì)數(shù)2,1-n中出現(xiàn)2的有n/2次,出現(xiàn)2^2的有n/4次,……,所以質(zhì)數(shù)2出現(xiàn)的次數(shù)為

n/2+n/4+……+n/2^m,所以貼代碼(這個(gè)需要自己理解一下):

#include<algorithm> #include<fstream> #include<iostream> #include<cmath> #include<cstdio> #include<cstdlib> #include<cstring> using namespace std;int n,p,tot,pri[10000010],vis[20000020]; long long mi[10000010]; long long ans;void Make_pri() {for (int i=2; i<=2*n; i++){if (vis[i]==0) {tot++; pri[tot] = i;}for (int j=1; j<=tot; j++){long long x = (long long)pri[j]*(long long)i;if (x>2*n) break; vis[x] = 1;if (i%pri[j]==0) break;}} }void Add(int len,int cur) {for (int i=1; i<=tot; i++){long long k = pri[i];while (k<=len){mi[i]+=(long long)cur*(long long)(len/k);k = k*pri[i];}} }void Fast_mi() {for (int i=1; i<=tot; i++){long long a = pri[i],b = mi[i];while (b>0){if (b%2==1) ans = ((long long)ans*(long long)a)%p;b = b/2; a = ((long long)a*(long long)a)%p;}} }int main() {freopen("c.in","r",stdin);freopen("c.out","w",stdout);scanf("%d%d",&n,&p);Make_pri(); n = n-2;Add(2*n,1); Add(n,-1); Add(n+1,-1); ans = 1;Fast_mi();printf("%I64d\n",ans);return 0; }

?

轉(zhuǎn)載于:https://www.cnblogs.com/Janous/p/7571608.html

總結(jié)

以上是生活随笔為你收集整理的蛋糕(卡特兰数)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。