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,左侧或右侧是否为空)。
原题链接
神犇的题解