题目:
题解:
这是一道prufer序列裸题
也就是相当于让我们求:长度为n-2的数列,每个数字出现的次数是
li
l
i
,不同的数列个数是多少。
(n−2)!l1!l2!...
(
n
−
2
)
!
l
1
!
l
2
!
.
.
.
。我们发现这个题目没有模数,我们就用质因数分解做。
这道题目特判注意。如果度数加起来不合条件直接退出;如果有点度数为0而且n!=1,那么直接退出
代码:
#include <cstdio>
#define LL long long
using namespace std;
const int N=200;
int d[N],pri[N],tot,cc[N];
bool ss[N];
LL ksm(LL a,LL k)
{
LL ans=1;
for (;k;k>>=1,a=a*a)
if (k&1) ans=ans*a;
return ans;
}
void pre(int n)
{
ss[1]=1;
for (int i=2;i<=n;i++)
{
if (!ss[i]) pri[++tot]=i;
for (int j=1;j<=tot && i*pri[j]<=n;j++)
{
ss[i*pri[j]]=1;
if (i%pri[j]==0) break;
}
}
}
int main()
{
int n,sum=0;scanf("%d",&n);
pre(n);
for (int i=1;i<=n;i++) scanf("%d",&d[i]),sum+=d[i];
sum-=n;
if (sum!=n-2) {printf("0");return 0;}
for (int i=2;i<=n-2;i++)
{
int id=1,dt=i;
while (dt!=1)
{
while (dt%pri[id]==0) dt/=pri[id],cc[id]++;
id++;
}
}
for (int i=1;i<=n;i++)
{
int id=1,dt=d[i]-1;
if (dt<0 && n!=1) {printf("0");return 0;}
if (dt<=0) continue;
while (dt!=1)
{
while (dt%pri[id]==0) dt/=pri[id],cc[id]--;
id++;
}
}
LL ans=1;
for (int i=1;i<=n;i++) ans*=ksm(pri[i],cc[i]);
printf("%lld",ans);
}