【BZOJ 1005】 1005: [HNOI2008]明明的烦恼 (prufer数列+高精度)

1005: [HNOI2008]明明的烦恼

Time Limit: 1 Sec  Memory Limit: 162 MB
Submit: 4981  Solved: 1941

Description

  自从明明学了树的结构,就对奇怪的树产生了兴趣......给出标号为1到N的点,以及某些点最终的度数,允许在
任意两点间连线,可产生多少棵度数满足要求的树?

Input

  第一行为N(0 < N < = 1000),
接下来N行,第i+1行给出第i个节点的度数Di,如果对度数不要求,则输入-1

Output

  一个整数,表示不同的满足要求的树的个数,无解输出0

Sample Input

3
1
-1
-1

Sample Output

2

HINT

  两棵树分别为1-2-3;1-3-2

Source

 

 

【分析】

  先特判无解的情况。

  假设$sum=\sum(d[i]-1)|[d[i]!=-1]$

  $ss=\sum 1 [d[i]!=-1]$

  则$Ans=C_{n-2}^{sum}*\dfrac{sum!}{\Pi(d[i]-1)!}*(n-ss)^{n-2-sum}$

  即$Ans=\dfrac{(n-2)!}{(n-2-sum)!*\Pi(d[i]-1)!}*(n-ss)^{n-2-sum}$

  这些数值都不会超过n的,先手动消因子,然后Ans用高精度,就是高精乘单精。

 

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cstring>
 4 #include<iostream>
 5 #include<algorithm>
 6 using namespace std;
 7 #define Maxn 1010
 8 #define mod 10000
 9 
10 int cnt[Maxn],d[Maxn];
11 
12 struct hugeint
13 {
14     int w[Maxn],l;
15     hugeint() {memset(w,0,sizeof(w));l=0;}
16     friend hugeint operator * (hugeint x,int y)
17     {
18         for(int i=0;i<=x.l;i++) x.w[i]*=y;
19         for(int i=0;i<=x.l;i++) x.w[i+1]+=x.w[i]/mod,x.w[i]%=mod;
20         while(x.w[x.l+1]!=0) x.w[x.l+2]+=x.w[x.l+1]/mod,x.w[++x.l]%=mod;
21         while(x.w[x.l]==0&&x.l>0) x.l--;
22         return x;
23     }
24 };
25 
26 void cal(int x,int y)
27 {
28     for(int i=2;i<=x*x;i++) if(x%i==0)
29     {
30         while(x%i==0) cnt[i]+=y,x/=i;
31     }
32     if(x!=1) cnt[x]+=y;
33 }
34 
35 int main()
36 {
37     int n;
38     scanf("%d",&n);
39     for(int i=1;i<=n;i++) scanf("%d",&d[i]);
40     if(n==1&&d[1]>0) printf("0\n");
41     else
42     {
43         int sum=0,ss=0;
44         for(int i=1;i<=n;i++) if(d[i]!=-1) sum+=d[i]-1,ss++;
45         else if(d[i]==0||d[i]>=n) {printf("0\n");return 0;}
46         if(sum>n-2) printf("0\n");
47         else
48         {
49             // for(int i=1;i<=n;i++) if(d[i]!=-1) d[i]--;
50             for(int i=1;i<=n;i++) cnt[i]=0;
51             for(int i=2;i<=n-2;i++) cal(i,1);
52             for(int i=2;i<=n-2-sum;i++) cal(i,-1);
53             for(int i=1;i<=n;i++) if(d[i]!=-1)
54             {
55                 for(int j=2;j<=d[i]-1;j++) cal(j,-1);
56             }
57             cal(n-ss,n-2-sum);
58             hugeint ans;ans.w[0]=1;
59             for(int i=2;i<=n;i++) while(cnt[i]--) ans=ans*i;
60             printf("%d",ans.w[ans.l]);
61             for(int i=ans.l-1;i>=0;i--) printf("%04d",ans.w[i]);printf("\n");
62         }
63     }
64     return 0;
65 }
View Code

 

2017-04-25 15:36:48

转载于:https://www.cnblogs.com/Konjakmoyu/p/6762407.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园的建设目标是通过数据整合、全面共享,实现校园内教学、科研、管理、服务流程的数字化、信息化、智能化和多媒体化,以提高资源利用率和管理效率,确保校园安全。 智慧校园的建设思路包括构建统一支撑平台、建立完善管理体系、大数据辅助决策和建设校园智慧环境。通过云架构的数据中心与智慧的学习、办公环境,实现日常教学活动、资源建设情况、学业水平情况的全面统计和分析,为决策提供辅助。此外,智慧校园还涵盖了多媒体教学、智慧录播、电子图书馆、VR教室等多种教学模式,以及校园网络、智慧班牌、校园广播等教务管理功能,旨在提升教学品质和管理水平。 智慧校园的详细方案设计进一步细化了教学、教务、安防和运维等多个方面的应用。例如,在智慧教学领域,通过多媒体教学、智慧录播、电子图书馆等技术,实现教学资源的共享和教学模式的创新。在智慧教务方面,校园网络、考场监控、智慧班牌等系统为校园管理提供了便捷和高效。智慧安防系统包括视频监控、一键报警、阳光厨房等,确保校园安全。智慧运维则通过综合管理平台、设备管理、能效管理和资产管理,实现校园设施的智能化管理。 智慧校园的优势和价值体现在个性化互动的智慧教学、协同高效的校园管理、无处不在的校园学习、全面感知的校园环境和轻松便捷的校园生活等方面。通过智慧校园的建设,可以促进教育资源的均衡化,提高教育质量和管理效率,同时保障校园安全和提升师生的学习体验。 总之,智慧校园解决方案通过整合现代信息技术,如云计算、大数据、物联网和人工智能,为教育行业带来了革命性的变革。它不仅提高了教育的质量和效率,还为师生创造了一个更加安全、便捷和富有智慧的学习与生活环境。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值