#dp,高精度#洛谷 4295 [SCOI2003]严格N元树


题目

求有多少棵严格 \(n\) 叉树深度为 \(k\)


分析

考虑往下放子孙挺难维护的,考虑在上面换新的根。

\(dp[i]\) 表示深度不超过 \(i\) 的方案数,那么

\(dp[i]=dp[i-1]^n+1\)

就是新开一个根,每个子节点的选择独立,为 \(dp[i-1]^n\),再加上只有一个根节点的情况。

最后答案就是 \(dp[k]-dp[k-1]\)


代码

#include 
#include 
using namespace std;
const int N=1011; int ans[N],Ans[N],C[N],t[N],k,n;
void one(int *ans){
	int now=1;
	while (ans[now]==9) ++now;
	if (now>ans[0]) ans[0]=now;
	++ans[now];
	for (int i=1;i>=1,mul(ans,ans))
	    if (y&1) mul(t,ans);
	memcpy(ans,t,sizeof(t));
}
void dec(int *ans){
	int g=0,s;
	for (int i=1;i<=ans[0];++i){
		s=ans[i]-Ans[i]-g;
		if (s<0) g=1,ans[i]=s+10;
		    else g=0,ans[i]=s;
	}
	while (ans[0]&&!ans[ans[0]]) --ans[0]; 
}
int main(){
	scanf("%d%d",&k,&n);
	if (!n||k==1) return !printf("1");
	ans[ans[0]=1]=1;
	for (int i=1;i<=n;++i){
		memcpy(Ans,ans,sizeof(ans));
		ksm(ans),one(ans);
	}
	dec(ans);
	for (int i=ans[0];i;--i) putchar(ans[i]+48);
	return 0; 
} 

相关