2 条题解

  • 0
    @ 2025-10-8 17:03:18
    #include<bits/stdc++.h> 
    using namespace std;
    const int N=155;
    int n, sum, d[N];
    long long C[N][N];
    
    int main()
    {
        int n;scanf("%d", &n);
        int sum=0;
        for(int i=1;i<=n;i++)
        {
            scanf("%d", &d[i]); sum += d[i]-1;
            if(d[i]==0 && n>1) return printf("0\n"), 0;
        }
        if(n==1) return printf("%d\n", !d[1]), 0;
        if(sum!=(n-2)) return printf("0\n"), 0;
        
        for(int i=0;i<=n-2;i++)C[i][0] = 1; 
        for(int i=1;i<=n-2;i++)for(int j=1;j<=i;j++)
            C[i][j] = C[i-1][j-1] + C[i-1][j];
        long long ans=1;    
        for(int i=1;i<=n;i++)ans = ans * C[sum][d[i]-1], sum -= (d[i]-1);
        printf("%lld\n", ans);
        return 0;    
    }
    
    • 0
      @ 2025-10-8 17:03:08
      #include<bits/stdc++.h> 
      using namespace std;
      const int N=155;
      int n,sum,d[N];
      long long C[N][N];
      
      int main()
      {
      	int n;scanf("%d", &n);
      	int sum=0;
      	for(int i=1;i<=n;i++)
      	{
      		scanf("%d",&d[i]),sum+=d[i]-1;
      		if(d[i]==0 && n>1) return printf("0\n"), 0;
      	}
      	if(n==1) return printf("%d\n",!d[1]),0;
      	if(sum!=(n-2)) return printf("0\n"), 0;
      	
      	for(int i=0;i<=n-2;i++)C[i][0] = 1; 
      	for(int i=1;i<=n-2;i++)for(int j=1;j<=i;j++)
      		C[i][j]=C[i-1][j-1]+C[i-1][j];
      	long long ans=1;	
      	for(int i=1;i<=n;i++)ans= ans*C[sum][d[i]-1],sum-=(d[i]-1);
      	printf("%lld\n", ans);
      	return 0;	
      }
      • 1

      【Prüfer序列】[HNOI2004] 树的计数

      信息

      ID
      2864
      时间
      1000ms
      内存
      64MiB
      难度
      8
      标签
      递交数
      18
      已通过
      7
      上传者