【BZOJ 1089】[SCOI2003]严格n元树

【链接】 我是链接,点我呀:)
【题意】

在这里输入题意

【题解】

设fi表示深度为i的树个数,si是fi的前缀和,即si为深度不超过i树的个数。 那么si=s[i-1]^n + 1

就是说 先选一个节点作为根节点 然后选n个深度不超过i-1的树接在根节点下面。

这n个子树每个子树都有s[i-1]种取法。
所以是它的n次方。

注意:si这里混杂了深度为i和小于i的树。但没有深度为0的了,所以把这个深度为0的一个节点加上去就好.也即递推式中的加1

最后答案就是s[d]-s[d-1]了

用java的biginteger写
(加一个快速幂

【代码】

import java.math.BigInteger;
import java.util.*;
public class Main {
	
	private static BigInteger ksm(BigInteger x,int y) {
		BigInteger temp = new BigInteger("1");
		while (y>0) {
			if ((y&1)==1) temp = temp.multiply(x);
			x = x.multiply(x);
			y>>=1;
		}
		return temp;
	}
	
	public static void main(String[] args) {
		Scanner cin = new Scanner(System.in);
		int n,d;
		n = cin.nextInt();d = cin.nextInt();
		BigInteger a = new BigInteger("1");
		for (int i = 1;i <= d;i++) {
			BigInteger b = ksm(a,n);
			b = b.add(new BigInteger("1"));
			if (i==d)
				a = b.subtract(a);
			else
				a = b;
		}
		System.out.println(a);
	}
}

posted @ 2018-03-15 15:21  AWCXV  阅读(109)  评论(0编辑  收藏  举报