bzoj1005: [HNOI2008]明明的烦恼
又是调了很久。。。自己测小数据不会WA啊。。。然后就拿标程对拍,拍着发现错了(输出000/0),然后继续拍。交还是WA。看一下数据生成,似乎有点不对劲。改一下。又拍出错了。原来我ans数组开小了。。。于是改后交上去就A了。。。又不爽又开心所以说数据范围要注意!输出格式错误要注意!。。。啊忘了说题解。。。会求Cn m就好啦(组合数。然后推一下公式(by 黄学长。然后高精乘低精再质因数暴力分解求阶乘就好了(黄学长的做法乘的时候有优化。。。(注意


#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define rep(i,n) for(int i=1;i<=n;i++)
#define clr(x,c) memset(x,c,sizeof(x))
#define REP(i,s,t) for(int i=s;i<=t;i++)
int read(){
int x=0;char c=getchar();bool f=true;
while(!isdigit(c)){
if(c=='-') f=false;c=getchar();
}
while(isdigit(c)) x=x*10+c-'0',c=getchar();
return f?x:-x;
}
const int nmax=1005;
const int inf=0x7f7f7f7f;
int a[nmax],prime[nmax],ans[6005],num[nmax],len,n,cnt=0,lft=0;
bool vis[nmax],flag=true;
void READ(){
n=read();
if(n==1){
a[1]=read();
if(!a[1]) printf("1");else printf("0");
flag=false;
return ;
}
rep(i,n) {
a[i]=read();
if(a[i]==-1) lft++;
else if(!a[i]&&flag) printf("0"),flag=false;
else cnt+=a[i]-1;
}
if(cnt>n-2&&flag) printf("0"),flag=false;
}
void init(){
clr(vis,false);prime[0]=0;
REP(i,2,1000) if(!vis[i]) {
prime[++prime[0]]=i;
for(int j=i+i;j<=1000;j+=i) vis[j]=true;
}
}
void get(int x,int op){
REP(i,2,x) {
int tmp=i;
rep(j,prime[0]) {
if(tmp==1) break;
while(tmp!=1&&tmp%prime[j]==0) num[j]+=op,tmp/=prime[j];
}
}
}
void mul(int x){
rep(i,len) ans[i]*=x;
rep(i,len-1) if(ans[i]>=10) ans[i+1]+=ans[i]/10,ans[i]%=10;
while(1){
if(ans[len]>=10) ans[++len]=ans[len-1]/10,ans[len-1]%=10;
else break;
}
}
void work(){
get(n-2,1);get(n-2-cnt,-1);
rep(i,n) if(a[i]!=-1) get(a[i]-1,-1);
clr(ans,0);ans[1]=1;len=1;
rep(i,prime[0]) rep(j,num[i]) mul(prime[i]);
rep(i,n-2-cnt) mul(lft);
for(int i=len;i;i--) printf("%d",ans[i]);
}
int main(){
READ();
if(!flag) return 0;
init();work();return 0;
};
1005: [HNOI2008]明明的烦恼
Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 4077 Solved: 1623
[Submit][Status][Discuss]
Description
自从明明学了树的结构,就对奇怪的树产生了兴趣......给出标号为1到N的点,以及某些点最终的度数,允许在
任意两点间连线,可产生多少棵度数满足要求的树?
Input
第一行为N(0 < N < = 1000),
接下来N行,第i+1行给出第i个节点的度数Di,如果对度数不要求,则输入-1
Output
一个整数,表示不同的满足要求的树的个数,无解输出0
Sample Input
3
1
-1
-1
1
-1
-1
Sample Output
2
HINT
两棵树分别为1-2-3;1-3-2

浙公网安备 33010602011771号