HDU 2048 点击打开链接(题目链接)
刷水题时到这卡了一下...这里要用到一个 全错位排列 公式 a[i] = (i-1) * (a[i-2] + a[i-1])
原问题:一个人写了n封不同的信及相应的n个不同的信封,他想把这n封信都装错信封,问有多少中情况?
思路很简单 用错排公式算出n种情况 a[n] 比上 总情况的数量 b[n]
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
double a[30]= {0,0,1,2};//错排打个表
double b[30]= {1,1};//总情况 也就是阶乘
int i;
for(i=4; i<=20; i++)
a[i]=(i-1)*(a[i-1]+a[i-2]);//错排公式
for(i=2; i<=20; i++)
b[i]=i*b[i-1];
int T,n;
cin>>T;
while(T--)
{
cin>>n;
printf("%.2f%%\n",100*a[n]/b[n]);
}
}