就是一个错排的公式,错排的相关简介见链接:
此题用到的公式是:f(n)=(n-1)*(f(n-1)+f(n-2));
其递推公式是:f(n)=n!(1-1/1!+1/2!-1/3!+1/4!+....................+(-1)^n*1/n!);
本题还有一点就是,set[]数组存的数据过大,约为25!用int型来存,显然不够,所以要定义为 long long型,今天看了一下long long型的数据类型,数据范围能占到8个字节,与__int64是同一个东西,只是不同编译器下的不同写法而已,其输出形式为%I64d。
#include<stdio.h> #include<string.h> #include<stdlib.h> long long set[25]; void fun() { memset(set,0,sizeof(set)); set[1]=0; set[2]=1; for(int i=3;i<25;i++) { set[i]=(i-1)*(set[i-1]+set[i-2]); } } int main() { fun(); int n; while(scanf("%d",&n)!=EOF) { printf("%I64d\n",set[n]); } //system("pause"); return 0; }