12
Dislocation permutation problem
use a, B, C ... An envelope written with the names of N friends, A, B, c ... Represents n copies of the corresponding written stationery. The total number of wrong attire is recorded as f (n). Assuming that a error is loaded into B, there are two types of wrong-loading methods that contain the mistake: (1B is loaded in a, when the remainder of each type of error is unrelated to a, B, a, b, should be f (N-2) The method of wrong loading. (2b into an envelope outside a and B, at which time the letter-loading work is actually put (except for a) (N-1) Letter B, C ... Loading (except for B) n-1 envelopes A, C ..., obviously this fashion wrong method has F (n1) species. All in all, under the error of a loading B, there is a common wrong loading method F (n-2) +f (n1Two A loading C, loading D ... N-2 errors, there are also F (N-2) +f (n1), so: F (n)= (n1) {f (n1) +f (n2)} formula can be rewritten as f (n)-NF (n1) =-[f (n1)-(n1) F (n2)] (n>2so you can get f (n)-NF (n1) =-[f (n1)-(n1) F (n2)]=((-1)^2) [F (n2)-(n2) F (n3)]=((-1)^3) [F (n3)-(n3) F (n4)]=...=[(-1) ^ (n2)][f (2) -2f (1)] and finally get a simpler recursive f (n)=NF (n1)+(-1) ^ (n2) or an equivalent F (n)=NF (n1)+(-1) ^ (n) n=2,3,4......
The code is as follows
1#include <cstdio>2#include <cstdlib>3#include <cstring>4#include <algorithm>5#include <iostream>6 using namespacestd;7typedefLong Longll;8 intN, K;9 Tenll dp[ -]; One intMainintargcChar Const*argv[]) A { -dp[0] =1; -dp[1] =1; thedp[2] =1; -dp[3] =2; - for(inti =4; I <= -; i++) { -Dp[i] = (I-1) * (dp[i-1]+dp[i-2]); + } - while(SCANF ("%d", &n)! =EOF) { +printf"%lld\n", Dp[n]); A } at return 0; -}