HDOJ_4602_Partition_题解

HDOJ_4602_Partition

Time Limit:

2000/1000 MS (Java/Others)

Memory Limit:

32768/32768 K (Java/Others)
___

Problem Description

Define f(n) as the number of ways to perform n in format of the sum of some positive integers.

For instance, when n=4, we have

4=1+1+1+1

4=1+1+2

4=1+2+1

4=2+1+1

4=1+3

4=2+2

4=3+1

4=4

totally 8 ways. Actually, we will have f(n)=2(n-1) after observations.

Given a pair of integers n and k, your task is to figure out how many times that the integer k occurs in such 2(n-1) ways.

In the example above, number 1 occurs for 12 times, while number 4 only occurs once.
___

Input

The first line contains a single integer T(1≤T≤10000), indicating the number of test cases.

Each test case contains two integers n and k(1≤n,k≤109).
___

Output

Output the required answer modulo 109+7 for each test case, one per line.
___

Sample Input

2

4 2

5 5
___

Sample Output

5

1

迷迷糊糊的,最初的思路根本不对,WA好几次后。。。弃了。。。我真是图样图森破。唉~~。

此处是神犇题解

进行复杂度估计,最初以为是 递推转化成为公式。思路卡在 如何进行构造,以算出:有1个k的式子有几个,2个的有几个。。。

这个冗杂到无从下手的奇葩思路或许通过及其复杂的化简,也能得到正确答案吧。如果有哪位神犇用递推的思路做出来了,一定要告诉我。

神犇的正确公式就不解释了,这个方法的整体思路就是脱离了具体的式子,直接去数当k在某个位置时,有多少种情况。比如1+k+1+k。这个式子中,k出现了2次,在计数的时候并不是被计为:含有两个k的一个式子,而是:两种k的位置情况都出现了的某个式子。

这时公式就粗线了:统计k在每个位置时 左侧的情况数,乘以相应的k右侧的情况数。这也是学长给的题解中的公式(稍作修改)

(n-k)

∑       f(i)*f(n-k-i)

(i=0)

f(x)=2^(x-1)
而f(0),一个元素都没有,当然只有一种情况了
f(0)=1

对这个公式直接进行化简也是可以的

除了i=0和i=n-k的时候,
f(i)*f(n-k-i)都等于2^(i-1+n-k-i-1)=2^(n-k-2)

原式=(n-k-1)*2^(n-k-2) + 2*f(0)*f(n-k)
    =(n-k-1)*2^(n-k-2) + 2^(n-k)

而对于这个式子的化简思路也就是大神得到公式的思路,分为两种情况,k包含端点与否(i或n-k-i是否为0,左侧或右侧是否为空)。

原题链接

神犇的题解

你可能感兴趣的:(HDOJ_4602_Partition_题解)