此题与[HNOI2008]明明的烦恼是同类型的题目。
在处理时记得质因数分解,直接做会炸精度。以及无解时输出0。
#include <cstdio>
#include <cmath>
#define ll long long
using namespace std;
int n,l;
int dr[155];
int pr[155],tot;
int num[155];
ll s[155],ans;
inline void solve(ll x,int f)
{
for(int i=1;i<=l;i++)
{
if(x<=1)return;
while(x%pr[i]==0)
{num[i]+=f;x/=pr[i];}
}
}
int main()
{
register int i,j;
scanf("%d",&n);
for (i=1;i<=n;i++) scanf("%d",&dr[i]);
for (i=2;i<=150;i++)
{
for (j=2;j<=sqrt(i);j++)
{
if (i%j==0) break;
}
pr[++l]=i;
}
if (n==1)
{
if (!dr[1]) printf("1");
else printf("0");
return 0;
}
for (i=1;i<=n;i++)
{
if (!dr[i])
{
printf("0");
return 0;
}
dr[i]--;
tot+=dr[i];
}
if (tot!=n-2)
{
printf("0");
return 0;
}
s[1]=1;ans=1;
for (i=2;i<=22;i++) s[i]=s[i-1]*i;
solve(s[n-2],1);
for(i=1;i<=n;i++) solve(s[dr[i]],-1);
for(int i=1;i<=l;i++)
while(num[i]--) ans*=pr[i];
printf("%lld",ans);
return 0;
}