题目描述
某人写了n封信和n个信封,如果所有的信都装错了信封。求所有信都装错信封共有多少种不同情况。
输入输出格式
输入格式:
一个信封数n(n<=20)
输出格式:
一个整数,代表有多少种情况。
题解
本题即为伯努利信封问题
360百科:错排公式
STD
1 #include<bits/stdc++.h> 2 using namespace std; 3 int n; 4 int b(int n) 5 { 6 if (n==1) return 0; 7 else if (n==2) return 1; 8 else return (n-1)*(b(n-1)+b(n-2)); 9 } 10 int main() 11 { 12 ios::sync_with_stdio(false); 13 cin>>n; 14 cout<<b(n); 15 return 0; 16 }
然而这题范围只有二十...
1 #include<bits/stdc++.h> 2 using namespace std; 3 int n; 4 int main(){ 5 cin>>n; 6 if(n==1){ 7 cout<<0; 8 return 0; 9 } 10 if(n==2){ 11 cout<<1; 12 return 0; 13 } 14 if(n==3){ 15 cout<<2; 16 return 0; 17 } 18 if(n==4){ 19 cout<<9; 20 return 0; 21 } 22 if(n==5){ 23 cout<<44; 24 return 0; 25 } 26 if(n==6){ 27 cout<<265; 28 return 0; 29 } 30 if(n==7){ 31 cout<<1854; 32 return 0; 33 } 34 if(n==8){ 35 cout<<14833; 36 return 0; 37 } 38 if(n==9){ 39 cout<<133496; 40 return 0; 41 } 42 if(n==10){ 43 cout<<1334961; 44 return 0; 45 } 46 if(n==11){ 47 cout<<14684570; 48 return 0; 49 } 50 if(n==12){ 51 cout<<176214841; 52 return 0; 53 } 54 if(n==13){ 55 cout<<2290792932; 56 return 0; 57 } 58 if(n==14){ 59 cout<<32071101049; 60 return 0; 61 } 62 if(n==15){ 63 cout<<481066515734; 64 return 0; 65 } 66 if(n==16){ 67 cout<<7697064251745; 68 return 0; 69 } 70 if(n==17){ 71 cout<<130850092279664; 72 return 0; 73 } 74 if(n==18){ 75 cout<<2355301661033953; 76 return 0; 77 } 78 if(n==19){ 79 cout<<44750731559645106; 80 return 0; 81 } 82 if(n==20){ 83 cout<<895014631192902121; 84 return 0; 85 } 86 }
不要问我第二段从哪来的,我是打出STD后CV大法搞出来的...