bzoj4563 [Haoi2016]放棋子

来源:互联网 发布:淘宝手机能开店吗 编辑:程序博客网 时间:2024/05/12 03:40

题目

感性认知,其实每行障碍的位置无所谓,不妨让它们在主对角线上,这样,就全错排就好了。

公式:f[i]=(i-1)*(f[i-1]+f[i-2]),f[1]=0,f[2]=1.

高精度。

//全错排 f[1]=0,f[2]=1,f[i]=(i-1)(f[i-1]+f[i-2])#include<iostream>#include<cstdlib>#include<cstdio>#include<cstring>#include<cmath>#include<ctime>#include<algorithm>#include<iomanip>#include<vector>#include<stack>#include<queue>#include<map>#include<set>#include<bitset>using namespace std;#define MAXN 2010#define MAXM 1010#define ll long long#define INF 1000000000#define MOD 1000000007#define eps 1e-8struct bn {    int x[MAXN];    int n;    bn() {        memset(x,0,sizeof(x));        n=0;    }    friend bn operator +(bn &x,bn &y) {        bn z;        int i;        z.n=max(x.n,y.n);        for(i=1; i<=z.n; i++) {            z.x[i]+=x.x[i]+y.x[i];            z.x[i+1]+=z.x[i]/10;            z.x[i]%=10;        }        while(z.x[z.n+1]) {            z.n++;            z.x[z.n+1]+=z.x[z.n]/10;            z.x[z.n]%=10;        }        return z;    }    friend bn operator *(bn &x,int y) {        bn z;        int i;        z.n=x.n;        for(i=1; i<=z.n; i++) {            z.x[i]+=x.x[i]*y;            z.x[i+1]+=z.x[i]/10;            z.x[i]%=10;        }        while(z.x[z.n+1]) {            z.n++;            z.x[z.n+1]+=z.x[z.n]/10;            z.x[z.n]%=10;        }        return z;    }};int n;bn f[210];int main() {    int i;    scanf("%d",&n);    f[0].n=1;    f[1].n=1;    f[0].x[1]=1;    f[1].x[1]=0;    for(i=2; i<=n; i++) {        f[i]=(f[i-1]+f[i-2]);        f[i]=f[i]*(i-1);    }    for(i=f[n].n; i; i--) {        printf("%d",int(f[n].x[i]));    }    printf("\n");    return 0;}
原创粉丝点击