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]); }