杭电2048

来源:互联网 发布:淘宝网高达模型 编辑:程序博客网 时间:2024/06/05 11:01

刚开始做得时候只考虑到前面N-1个人拿的都不是自己的票,然而可以有一个人不拿自己的票;考虑不完全

 

如果前面N-1个人拿的都不是自己的票,即前N-1个人满足错排,现在又来了一个人,他手里拿的是自己的票。只要他把自己的票与其他N-1个人中的任意一个交换,就可以满足N个人的错排。这时有N-1种方法。另外,我们考虑,如果前N-1个人不满足错排,而第N个人把自己的票与其中一个人交换后恰好满足错排。这种情况发生在原先N-1人中,N-2个人满足错排,有且仅有一个人拿的是自己的票,而第N个人恰好与他做了交换,这时候就满足了错排。因为前N-1个人中,每个人都有机会拿着自己的票。所以有N-1种交换的可能。综上所述:f(n) = (i - 1) * [f(n - 1) + f(n - 2)]

 

注意溢出问题,特别是子函数容易被忽略,做得时候就忘记了子函数中变量C溢出了

 

输出的结果要是float型的,所以要乘以100.0,不然会出错

 

#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
 __int64 jicheng(int a);//注意溢出
 __int64 a[21];
 int n,i;
 a[1]=0;
 a[2]=1;
 a[3]=2;
 for(i=4;i<21;i++)
 {
  a[i]=(i-1)*(a[i-2]+a[i-1]);
 }
 cin>>n;
 for(i=0;i<n;i++)
 {
  int m;
  cin>>m;
  cout<<setiosflags(ios::fixed)<<setprecision(2)<<a[m]*100.0/jicheng(m)<<'%'<<endl;
 }
}
__int64 jicheng(int a)
{
 __int64 c;
 if(a==1)
 return 1;
 c=a*jicheng(a-1);
 return c;
}