高精度和错位排列

#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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值