[题解](prufer)明明的烦恼

https://www.cnblogs.com/noip/archive/2013/03/10/2952520.html

以及高精(抄

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;

int n,cnt,d[1050],sum,tot;
struct bigint{
    int num[10000],len;
    bigint(){
        memset(num,0,sizeof(num));
        len=1;
    }
    bigint operator*(const int &rhs)const{
        bigint ans;
        ans.len=len+6;
        for(int i=1;i<=len;i++)ans.num[i]+=num[i]*rhs;
        for(int i=1;i<ans.len;i++)
        if(ans.num[i]>9){
            ans.num[i+1]+=ans.num[i]/10;
            ans.num[i]%=10;
        }
        while(!ans.num[--ans.len]);
        return ans;
    }
    bigint operator/(const int &rhs)const{
        bigint ans=*this;
        ans.len++;
        for(int i=ans.len;i;i--){
            ans.num[i-1]+=ans.num[i]%rhs*10;
            ans.num[i]/=rhs;
        }
        while(!ans.num[--ans.len]);
        return ans;
    }
}ans;
signed main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d",&d[i]);
        if(!d[i]){
            printf("0");return 0;
        }
        if(d[i]!=-1){
            sum+=d[i]-1;
            cnt++;
        }
    }
    if(sum>2*n-2){
        printf("0");return 0;
    }
    ans.num[1]=1;
    for(int i=n-1-sum;i<n-1;i++)
    ans=ans*i;
    for(int i=1;i<=n-2-sum;i++)
    ans=ans*(n-cnt);
    for(int i=1;i<=n;i++){
        for(int j=2;j<=d[i]-1;j++)
        ans=ans/j;
    }
    for(int i=ans.len;i;i--)
    printf("%d",ans.num[i]);
}

 

posted @ 2019-05-16 20:33  羊肉汤泡煎饼  阅读(105)  评论(0编辑  收藏  举报