// 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: //关于错排公式,网上有很多教程的,搜几篇看看吧,我这里就不罗列了,很好理解的。