杭电 1465 不容易系列之一

就是一个错排的公式,错排的相关简介见链接:

此题用到的公式是: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;

}

你可能感兴趣的:(杭电)