HDU 2068 RPG錯排 錯排公式

2022-07-30 02:15:16 字數 1171 閱讀 6405

1.題意:1到n的序列的排列中,元素位置與元素值相對應的情況(值為i的元素在某個排列中正好排在第i個位置)大於等於序列規模一半的情況,有多少個?

2.輸入輸出:每組資料乙個數,n,規定輸入以0結尾;

3.分析:原題意換句話說,就是針對1到n的全排列,錯排元素的個數小於等於n的情況有多少;

那麼,輸出即為:

,其中f[i]表示1到i的錯排方案數,後面一項為組合數,即選取i個錯排;

這裡推導一下錯排公式,f[n]表示1到n的錯排方案;第一步:選取n放到1到n-1之中任意乙個位置,這樣就有n-1種放法;第二步:分兩種情況,不妨設第一步被n佔據的位置為k,當位置n放置的數恰巧為k時,此時就相當於,k,n交換位置了,對應的錯排方案為f[n-2];當位置n放置的數不為k時,此時的情況:1到k-1,k+1到n的位置要錯排放置1到n-1的元素,n-1個 位置,n-1個元素,與f[n-1]的情況相比,只是多了一組(數k與位置n)的對應,而且這裡n不放置k,就等效於普通的情況下(數k與位置k)的錯排情況;舉個例子,位置12345,數12345,現在5放置在2的位置上,剩下數1234,位置1345,且位置5上不放2,這裡和1234-1234的錯排有什麼區別麼?把位置5當成位置2,反正也是2不放在位置5上,與1234-1234裡2不放在位置2上等效;綜上所述,錯排公式為f[i]=(i-1)*(f[i-1]+f[i-2]),其中,f[1]=0,f[2]=1;

1 # include 2 # include 3

using

namespace

std;

4const

int maxn=26;5

intdp[maxn];

6intn;7

long

long cn(int n,intm)8

18long

long res=up/down;

19return

res;20}

21void

init()

2229

intmain()

3040

return0;

41 }

hdu 2068 RPG的錯排 錯排)

problem description 今年暑假杭電acm集訓隊第一次組成女生隊,其中有一隊叫rpg,但做為集訓隊成員之一的野駱駝竟然不知道rpg三個人具體是誰誰。rpg給他機會讓他猜猜,第一次猜 r是公主,p是草兒,g是月野兔 第二次猜 r是草兒,p是月野兔,g是公主 第三次猜 r是草兒,p是公主...

hdu 2068 RPG的錯排(組合)

hdu 2068 rpg的錯排 description 今年暑假杭電acm集訓隊第一次組成女生隊,其中有一隊叫rpg,但做為集訓隊成員之一的野駱駝竟然不知道rpg三個人具體是誰誰。rpg給他機會讓他猜猜,第一次猜 r是公主,p是草兒,g是月野兔 第二次猜 r是草兒,p是月野兔,g是公主 第三次猜 r...

HDU 2068 RPG的錯排(錯排 排列組合)

problem description 今年暑假杭電acm集訓隊第一次組成女生隊,其中有一隊叫rpg,但做為集訓隊成員之一的野駱駝竟然不知道rpg三個人具體是誰誰。rpg給他機會讓他猜猜,第一次猜 r是公主,p是草兒,g是月野兔 第二次猜 r是草兒,p是月野兔,g是公主 第三次猜 r是草兒,p是公主...