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)。
View Code
我们可以特判出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
相关文章推荐
- hdu 4602 组合数学
- 【组合数学】隔板法解决HDU-3037
- HDU 4602 Partition 数学水题...
- HDU 4602 Partition 组成n的方案中k有几个 (好题!!!!找规律题+快速幂)
- hdu 6036 NTT取模(板子)+组合数学
- Famous Stone Collector HDU - 4248 组合数学+dp
- HDU 5738 Eureka(组合数学)
- hdu 4625 JZPTREE (组合数学)
- hdu-4602-Partition
- hdu 2965组合数学题
- HDU 4602 Partition
- 组合数学第二发 错排问题 hdu 2049 + hdu 2068
- HDU 2068 RPG的错排(组合数学--错排)
- HDU - 4810 Wall Painting(组合数学)
- HDU - 4810 Wall Painting(组合数学)
- HDU 1799 循环多少次?(组合数学)
- 【组合数学--拉姆齐定理】hdu 6152 Friend-Graph
- HDU 4349 Xiao Ming's Hope 组合数学
- HDU 5321 Beautiful Set (莫比乌斯反演 + 逆元 + 组合数学)
- HDU-4532 湫秋系列故事——安排座位 组合数学DP