將n個身高互不相同的人按要求排成一排,有多少種排法?

時間 2021-12-23 08:08:14

1樓:DuaiHan1020

排列方法數除了取決於人數,還取決於這些人具體身高差情況。

看你的說法,應該是預設了這些人身高形成等差數列。否則僅確定人數,排列方法數是不定的。比如123和124,排序方法數乙個是4,乙個是6。

但我不知道你的f(4)=10,包括之後的數怎麼算出來的,我看f(4)=18

2樓:靈劍

OEIS的鏈結裡面應該研究得比較清楚了,我簡單寫一下解法

首先這樣的交錯數列中,將第k小的替換成第k大的數,可以將第一步遞增的交錯數列替換成反向交錯的數列,因此兩種交錯方式的數列數量是相等的,因此總的數量是第一步遞增的交錯數列數量的兩倍——除了n=0和n=1的情況,這時候替換之後得到自身,我們規定n=0和n=1時第一步遞增的交錯數列數量為1,總數也是1。除此以外都有這個兩倍的關係。

設長度為n且第一步遞增的交錯數列數量為 ,在 時所有交錯數列總數就是 。考慮這n個數里最小的數,這個數的兩側一定是兩個第一步遞增的交錯數列(左邊的是左右映象過的),窮舉左邊數列的長度可以得到遞推式:

相當於先選擇i個數到左邊構造乙個數列,剩下的在右邊構造數列,總數是兩邊乘積再乘以組合數,最後對i求和,除以2是因為求得的是所有交錯數列,而我們定義f為第一步遞增的交錯數列。

注意到組合數可以寫成階乘的形式

令 ,可以消去階乘符號,變成

再次注意這個式子只對 的情況成立。

這個卷積的形式可以考慮引入母函式來處理。對這個式子兩邊同時乘以 ,得到

對 的項求和

令 ,有

和前面的式子比較可以發現只差k=0的項,也就是

補上n=1的項,注意到 ,有

而右邊的形式實際上是 的導數,於是有

這種非線性的微分方程一般是比較難解的,不過這個平方加一的形式讓我們想到了 ,注意到有

差個1/2的係數怎麼辦呢?調整下x的係數看看

這就對上了,但是G(x)還有初值條件 , 。後者從前面的方程裡倒是可以推出來,主要是前者和 對不上。再新增個常數:

代入初值 ,可以取 ,這樣就可以得到

可以用切割化弦和萬能公式求一下等價的形式

或這兩者不是完全等價的,後者的定義域要更小一些,沒有定義的點從 增加到了 ,不過反正我們只關心0附近的泰勒展開的形式,在這一點上兩者沒有區別。

注意到 是奇函式, 是偶函式,所以 的展開式的奇數項就是 的奇數項,偶數項就是 的偶數項。

遺憾的是 和 的泰勒展開並沒有特別簡單的表示式,查Wikipedia https://

en.wikipedia.org/wiki/T

aylor_series

可以看到的泰勒展開需要用伯努利數表示, 則需要用尤拉數表示,抄過來就有:

注意到這個只是第一步遞增的解法,全部解在 時是這個值的兩倍。可以查一下伯努利數和尤拉數的表對照一下。

具體計算上來說的話,考慮到 ,而 有相對簡單的表示式,可以用多項式求逆的方式求出尤拉數的數值,不考慮高精度運算複雜度的情況下應該可以做到 複雜度。而 的展開式可以利用 用多項式乘法求出來,複雜度也是 。

實際上 也有很明確的意義,就是n個元素任意乙個排列符合第一步遞增然後交錯的條件的概率。 時乘以2就是交錯的概率。

3樓:何樸藩

可以在oeis搜到相關研究。

oeis.org/A001250

我想到乙個動態規劃的解法:

dp[i][j]代表要把1到i這i個數排成交替序列a1a3a5...,且第乙個數只能選1到j,的方案數。

那麼原題在n>1時答案就是dp[n][n]*2,n<=1時特判答案為1。

初始值:dp[0][0] = 1

轉移方程:dp[i][j] = Sum dp[i-1][i-k], k in [1,j]

很容易得到乙個O(n^2)的演算法。n=

100f=[[

0foriin

range(n

+1)]forjin

range(n

+1)]f

[0][0

]=1foriin

range(1

,n+1

):s=0

forj

inrange(1

,i+1

):s+=f

[i-1

][i-j

]f[i

][j]=

sifi==

1:print

('a[1] = 1'

)else

:print

('a[

%d] = %d'

%(i,

f[i][

i]*2))

m個人,n件衣服(n m),將這n件衣服分配給m個人,每個人至少有一件衣服,有多少種分法?

丁克奎 可以先將n件衣服分成m堆,定義n件衣服分成m堆有s n,m 種排列,那麼n 1件衣服就有兩種可能性,一種是分成m堆,那麼剩下的一件衣服,就可以在m堆中選擇,有m種可能,另外一種是分成m 1堆,那麼剩下的一件衣服只能自成一堆,因此n件衣服分成m堆,有s n,m m s n 1,m s n 1,...

Matlab中,有n個1576x4的矩陣,將矩陣每行看作1個2x2矩陣,使n個矩陣對應行相乘怎麼操作?

井中的水 思路 先提取和重塑這些矩陣,然後再以此進行矩陣乘法,然後再進行封裝 用matrix來儲存這個1576 4的矩陣function matrix result matrix func matrix matrix result matrix 1 matrix result reshape mat...

N個球面最多將3維空間分成多少個部分?

羅宇航 初賽難度的組合題,由於本人不會用知乎打公式這裡就簡單說一下思路 先求出平面上面的圓最多把平面分成幾部分 利用遞推來求比較方便 這個是比較容易求得因為圓與圓最多有兩個交點,前n個圓把新加進去的圓的弧分成2n份,每份弧又把原來的區域分成2份,這樣就可以列出遞推方程,就不說了。利用這裡的出來的結論...