HDU 1465容易ではないシリーズの一つ【ミスマッチ】

1868 ワード

あるネット名は8006という男性の同級生で、ネットユーザーが無数にいて、最近この同級生はロマンチックに遊んで、同時にn人のネットユーザーに1人1通の手紙を書いて、これは何もなくて、命がけで、彼は意外にもすべての手紙を封筒に入れ間違えました!注意したんだけど、全部間違えたんだよ!
今の問題は:かわいそうな8006の同級生を手伝って計算してください.全部でいくつの可能性のある間違いがありますか.
 
Input
入力データは複数のテストインスタンスを含み、各テストインスタンスは1行を占有し、各行は正の整数n(1)を含む.
 
Output
各行の入力に対して可能なエラーの数を出力し、各インスタンスの出力に1行を占有します.
 
Sample Input
2
3
 
Sample Output
1
2
封筒詰めの問題は典型的なずれ問題である.
誤配式:
f(n)=(n-1)(f(n-1)+f(n-2))
クラシックな封筒の問題:
一人で書いた
9
異なる手紙とそれに対応する
9
違う封筒を
これ
n
手紙はすべて封筒を間違えて、すべて封筒の詰め方を間違えて何種類がありますか?
問題解決の考え方:
使用する
A

B

C
……
と書いてあります
n
友人の名前の封筒、
a

b

c
……
表示
n
分相応の書き方
良い便箋.誤装の総数を記す
f(n)
.仮に
a
誤装填
B
の中には、この間違いが含まれています.
のすべての誤装法は2種類に分けられます.
(
1
)
b
読み込み
A
の中で、この時すべての間違いの残りの部分はすべて
A

B

a

b
  
にかかわりなく
f(n-2)
種錯装法
.
(
2
)
b
読み込み
A

B
ほかの封筒は、このときの手紙を入れる作業は実際には
a
その他)

レター
b

c
……
ロード(除算)
B
以外)
n

1
封筒一つ
A

C
……
ああ、明らかにこのファッションが間違っている方法
あります
f(n-1)
種を植える.
とにかく
a
読み込み
B
の誤りの下に、誤装法がある
f(n-2)+f(n-1)
種を植える.
a
読み込み
C
、読み込み
D……

n

2
種の誤りの下には,同じようにある.
f(n-2)+f(n-1)
誤装法があるので
:
f(n)=(n-1)
(
f(n-1)+f(n-2)
)
#include 
int main()
{
	int n,i;
	__int64 a[21];
	a[1]=0;
	a[2]=1;
	for(i=3;i<21;i++)
		a[i]=(i-1)*(a[i-1]+a[i-2]);
	while( scanf("%d",&n) != EOF)
	printf("%I64d
",a[n]); return 0; }