zoukankan      html  css  js  c++  java
  • bzoj 1211 [HNOI2004]树的计数

    [HNOI2004]树的计数

    Description

    一个有n个结点的树,设它的结点分别为v1, v2, …, vn,已知第i个结点vi的度数为di,问满足这样的条件的不同的树有多少棵。给定n,d1, d2, …, dn,编程需要输出满足d(vi)=di的树的个数。

    Input

    第一行是一个正整数n,表示树有n个结点。第二行有n个数,第i个数表示di,即树的第i个结点的度数。其中1<=n<=150,输入数据保证满足条件的树不超过10^17个。

    Output

    输出满足条件的树有多少棵。

    Sample Input

    4
    2 1 2 1

    Sample Output

    2

    题解

    prufer编码,水题,不知道哪里wrong了,答案是(n-2)!/∏ (di-1)!

      1 #include<cstring>
      2 #include<cmath>
      3 #include<iostream>
      4 #include<algorithm>
      5 #include<cstdio>
      6 
      7 #define N 157
      8 #define ll long long
      9 using namespace std;
     10 inline int read()
     11 {
     12     int x=0,f=1;char ch=getchar();
     13     while(ch>'9'||ch<'0'){if (ch=='-') f=-1;ch=getchar();}
     14     while(ch<='9'&&ch>='0')
     15     {
     16         x=(x<<3)+(x<<1)+ch-'0';
     17         ch=getchar();
     18     }
     19     return x*f;
     20 }
     21 
     22 int n;
     23 int a[157];
     24 int sz,pri[N],num[N],boo[N];
     25 
     26 void solve_fj()
     27 {
     28     for (int i=2;i<=n;i++)
     29     {
     30         if (!boo[i]) pri[++sz]=i;
     31         for (int j=1;j<=sz&&pri[j]*i<=n;j++)
     32         {
     33             int t=pri[j]*i;
     34             boo[t]=1;
     35             if (i%pri[j]==0) break;
     36         }
     37     }
     38     for (int i=2;i<=n-2;i++)
     39     {
     40         int x=i;
     41         for (int j=1;j<=sz;j++)
     42             while(x%pri[j]==0)
     43             {
     44                 num[j]++;
     45                 x/=pri[j];
     46             }    
     47     }
     48 }
     49 ll ksm(ll a,int b)
     50 {
     51     ll res=1LL;
     52     while(b)
     53     {
     54         if (b%2) res=res*a;
     55         a=a*a;
     56         b>>=1;
     57     }
     58     return res;
     59 }
     60 void solve()
     61 {
     62     for (int t=1;t<=n;t++)
     63     {
     64         if (a[t]<=2) continue;
     65         for (int i=2;i<=a[t]-1;i++)
     66         {
     67             int x=i;
     68             for (int j=1;j<=sz;j++)
     69                 while(x%pri[j]==0)
     70                 {
     71                     num[j]--;
     72                     x/=pri[j];
     73                 }
     74         }
     75     }
     76     ll ans=1;
     77     for (int i=1;i<=sz;i++)
     78         ans*=ksm(pri[i],num[i]);
     79     printf("%lld",ans);    
     80 }
     81 int main()
     82 {
     83     n=read();for (int i=1;i<=n;i++) a[i]=read();
     84     solve_fj();
     85     
     86     int num=0;
     87     if (n==1&&a[1]==0)
     88     {
     89         printf("1
    ");
     90         return 0;
     91     }
     92     else if (n==1)
     93     {
     94         printf("0
    ");
     95         return 0;
     96     }
     97     for (int i=1;i<=n;i++)
     98         if (a[i]==0)
     99         {
    100             printf("0
    ");
    101             return 0;
    102         }
    103     for (int i=1;i<=n;i++)
    104         num+=a[i]-1;
    105     if (num!=n-2) printf("0");
    106     else solve();    
    107 }
  • 相关阅读:
    nginx 相关命令
    uni-app跨域解决
    vue-cli3.0的项目搭建
    vue.js
    Flex布局
    javascript 数组排重
    IE的hack问题浅谈
    div自身高度、屏幕高度
    bootstrap轮播和百叶窗
    面向对象
  • 原文地址:https://www.cnblogs.com/fengzhiyuan/p/8028254.html
Copyright © 2011-2022 走看看