高精度和错位排列

来源:互联网 发布:手机记牌器软件 编辑:程序博客网 时间:2024/05/11 08:54
#include<cstdio>#include<cstdlib>#include<cstring>#include<iostream>using namespace std;const int maxn=210,maxnlen=1000+10;struct number{    int x[maxnlen],len;    number(){        memset(x,0,sizeof(x));        len=0;    }    /*number operator * (number a){        number res;        res.len=len+a.len-1;        for(int i=0;i<len;i++){            for(int j=0;j<a.len-1;j++){                res.x[i+j]=x[i]*a.x[j];                res.x[i+j+1]+=res.x[i+j]/10;                res.x[i+j+1]%=10;            }        }        while(res.x[res.len]){            res.x[res.len+1]=res.x[res.len]/10;            res.x[res.len]%=10;            ++res.len;        }        return res;    }*/    number operator * (int b){        number res;        res.len=len;        for(int i=0;i<res.len;i++){            res.x[i]+=x[i]*b;            res.x[i+1]+=res.x[i]/10;            res.x[i]%=10;        }        while(res.x[res.len]){            res.x[res.len+1]+=res.x[res.len]/10;            res.x[res.len]%=10;            ++res.len;        }        return res;    }    number operator +(number a){        number res;        res.len=max(len,a.len);        for(int i=0;i<res.len;i++){            res.x[i]+=a.x[i]+x[i];            res.x[i+1]+=res.x[i]/10;            res.x[i]%=10;        }        while(res.x[res.len]){            res.x[res.len+1]+=res.x[res.len]/10;            res.x[res.len]%=10;            ++res.len;        }        return res;    }    void print(){        for(int i=len-1;i>=0;i--)printf("%d",x[i]);printf("\n");    }}dp[maxn];int main(){    int i,j,k,m,n;    scanf("%d",&n);    dp[0].len=1;dp[0].x[0]=1;    dp[1].len=1;    for(i=2;i<=n;i++){        dp[i]=(dp[i-1]+dp[i-2])*(i-1);    }    dp[n].print();    return 0;}

0 0
原创粉丝点击