就是一个错排的公式,错排的相关简介见链接:
此题用到的公式是: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;
}