P2624 [HNOI2008]明明的烦恼
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; typedef long long LL; inline int read() { char c=getchar();int num=0;bool f=1; for(;!isdigit(c);c=getchar()) f=c=='-'?0:f; for(;isdigit(c);c=getchar()) num=num*10+c-'0'; return f?num:-num; } const int N=1e4+5; int n,m; int d[N],tot; int prime[N],cnt; bool flag[N]; void init() { for(int i=2,t;i<N;++i) { if(!flag[i]) prime[++cnt]=i; for(int j=1;j<=cnt&&(t=i*prime[j])<N;++j) { flag[t]=1; if(i%prime[j]==0) break; } } } inline LL ksm(LL x,LL k) { LL res=1; while(k) { if(k&1) res=res*x; x*=x; k>>=1; } return res; } int num[N]; inline void chai(int x,int f) { for(int i=1;i<=cnt&&x>1;++i) { while(x%prime[i]==0) { num[i]+=f; x/=prime[i]; } } return; } int ans[N],l,x; inline void mul(int *a) { x=0; ans[1]=l=1; for(int i=1;i<=cnt;++i) { for(int j=1;j<=a[i];++j) { for(int k=1;k<=l;++k) { ans[k]=ans[k]*prime[i]+x; x=ans[k]/10; ans[k]%=10; } while(x) { ans[++l]=x%10, x/=10; } } } } int main() { // freopen("3.in","r",stdin); // freopen("466.out","w",stdout); init(); n=read(); if(n==1) { n=read(); if(n) putchar('0'); else putchar('1'); return 0; } for(int i=1;i<=n;++i) { d[i]=read(); if(d[i]==0) { puts("0"); return 0; } if(d[i]==-1) ++m; else { tot+=(d[i]-=1); for(int j=1;j<=d[i];++j) chai(j,-1); } } if(tot>n-2) { puts("0"); return 0; } for(int i=1;i<=n-2-tot;++i) chai(i,-1); for(int i=1;i<=n-2;++i) chai(i,1); if(m>1) { for(int i=1;i<=n-2-tot;++i) chai(m,1); } mul(num); for(;l;--l) cout<<ans[l]; return 0; }