標籤:get blog img height pre ref namespace http ios
題目描述
小 C 在自己家的花園裡種了一棵蘋果樹, 樹上每個結點都有恰好兩個分支. 經過細心的觀察, 小 C 發現每一天這棵樹都會生長出一個新的結點.
第一天的時候, 果樹會長出一個根結點, 以後每一天, 果樹會隨機播放一個當前樹中沒有長出過結點 的分支, 然後在這個分支上長出一個新結點, 新結點與分支所屬的結點之間串連上一條邊.
小 C 定義一棵果樹的不便度為樹上兩兩結點之間的距離之和, 兩個結點之間 的距離定義為從一個點走到另一個點的路徑經過的邊數.
現在他非常好奇, 如果 NNN 天之後小 G 來他家摘蘋果, 這個不便度的期望 EEE 是多少. 但是小 C 討厭分數, 所以他只想知道 E×N!E \times N !E×N! 對 PPP 模數的結果, 可以證明這是一個整數.
輸入輸出格式
輸入格式:
從標準輸入中讀入資料. 一行兩個整數 NNN (N<=2000), PPP .
輸出格式:
輸出到標準輸出中. 輸出一個整數表示答案.
輸入輸出範例
輸入範例#1:複製
3 610745795
輸出範例#1: 複製
24
輸入範例#2: 複製
305 1000000007
輸出範例#2: 複製
865018107
說明
以上是所有 N=3N = 3N=3 時可能的蘋果樹形態, 其中編號表示這個結點是第幾天生 長出來的, 顯然每種情況兩兩結點的距離均為 444 .
傳送門
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<cmath> 6 using namespace std; 7 int fac[2001],C[2001][2001],F[2001][2001],n,Mod,ans; 8 int main() 9 {int i,j;10 cin>>n>>Mod;11 fac[0]=1;12 for (i=1;i<=n;i++)13 fac[i]=1ll*fac[i-1]*i%Mod;14 for (i=0;i<=n;i++)15 {16 C[i][0]=1;17 for (j=1;j<=i;j++)18 C[i][j]=(C[i-1][j-1]+C[i-1][j])%Mod;19 }20 for (i=1;i<=n;i++)21 {22 F[i][0]=1;23 for (j=1;j<=n;j++)24 F[i][j]=1ll*F[i][j-1]*(i+j-2)%Mod;25 }26 for (i=2;i<=n;i++)27 {28 for (j=n-i+1;j>=1;j--)29 {30 ans=(ans+(1ll*j*(n-j)%Mod*C[n-i][j-1]%Mod*fac[j]%Mod*F[i][n-j-i+1]%Mod*fac[i]%Mod))%Mod;31 }32 }33 cout<<ans;34 }
[HAOI2018]蘋果樹