UVA 10516 Another Counting Problem

本博客详细解释了如何通过递归公式计算n叉树中不超过特定层数的树的种类数量,特别关注了避免预处理大数结果的策略,并提供了Java代码实现。

UVA_10516

    我们不妨设在n叉树时,不超过i层的树的种类为f[i],那么对于由i-1变到i时,我们新添的根节点要么所有子树都有,即共有f[i-1]^n种情况,要么一个子树也没有,即只有一种情况,于是我们就可以得到递推式f[i]=f[i-1]^n+1,最后输出f[d]-f[d-1]即可。

    此外,这个题目说最后结果保证200位以内,但不是所有题目范围之内的数据都是200位以内的,只不过测试数据里面没有罢了,因此我们干脆不要去预处理了,有些结果是相当庞大的。

import java.math.BigInteger;
import java.util.Scanner;

public class Main {
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
for(;;)
{
int n = cin.nextInt();
int d = cin.nextInt();
if(n == 0 && d == 0)
break;
BigInteger[] f = new BigInteger[20];
f[0] = new BigInteger("1");
for(int i = 1; i <= d; i ++)
{
f[i] = new BigInteger("1");
for(int j = 0; j < n; j ++)
f[i] = f[i].multiply(f[i - 1]);
f[i] = f[i].add(BigInteger.ONE);
}
if(d == 0)
System.out.println(n + " " + d + " " + "1");
else
System.out.println(n + " " + d + " " + f[d].add(f[d - 1].negate()));
}
}
}


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值