// HDOJ 1465 不容易系列之一
// @author: bos
// @date: 2012.2.9
//错排问题
#include <stdio.h>
#include <memory.h>
int main()
{
int n;
_int64 f[21]= {0}; //注意这里用到C++的扩展类型_int64,表示范围更大,关于它
while(scanf("%d", &n)!= EOF) //跟long或者long long的区别是请看下面的知识点。
{
memset(f, 0, sizeof(f));
int i;
f[2]= 1;
for (i= 3; i< 21; i++) //需从3开始
{
f[i]= (i- 1)*( f[i-1]+ f[i-2]); //错排公式
}
printf("%I64d\n", f[n]);
}
return 0;
}
// 知识点1:
// _int64是微软VC中对C++的扩展类型,格式控制符是%I64d,无符号是%I64u。
// long long是G++编译器支持的64位数类型,格式控制符是%lld,无符号是%llu。
//在OJ中,如果使用C++,你使用_int64或者long long都行,但是格式控制符必须是%I64d
//知识点2:
//关于错排公式,网上有很多教程的,搜几篇看看吧,我这里就不罗列了,很好理解的。