您的位置:首页 > 其它

hdu 4602 Partition 数学(组合-隔板法)

2013-07-24 17:39 309 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4602

我们可以特判出n<= k的情况。

对于1<= k<n,我们可以等效为n个点排成一列,并取出其中的连续k个点。下面分两种情况考虑:

第一种情况,被选出的不包含端点,那么有(n–k−1)种情况完成上述操作,剩下未被圈的点之间还有(n–k−2)个位置,可以在每个位置断开,所以共2^(n−k−2) ∗(n−k−1)种方法。

第二种情况,即被选出的包含端点,那么有2种情况,并且剩余共(n–k−1)个位置,所以共2∗2^(n–k−1)种方法。

总计2∗2^(n–k−1) +2^(n–k−2) ∗(n–k−1)=(n–k+3)* 2^(n–k−2)。

#include<cstdio>
using namespace std;
const long long moder = 1e9 + 7;

long long power(long long t){
if(t == 0) return 1;
long long ans = power(t/2) % moder;
ans = ans * ans % moder;
if(t % 2)  ans = ans * 2 % moder;
return ans;
}
int main()
{
int T;
scanf("%d",&T);
while(T--){
int n,k;
scanf("%d%d",&n,&k);
if(k>n) printf("0\n");
else if(k == n) printf("1\n");
else if(n - k == 1) printf("2\n");
else{
long long int ans = (((n-k+3)%moder)* (power(n-k-2)%moder))% moder ;
printf("%I64d\n",ans);
}
}
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: