zoukankan      html  css  js  c++  java
  • Partition HDU

    题目链接:Vjudge 传送门
    相当于把nn个点分隔为若干块,求所有方案中大小为kk的块数量
    我们把大小为kk的块,即使在同一种分隔方案中的块
    单独考虑,它可能出现的位置是在nn个点的首、尾、中

    • 出现在首尾时,有22种情况,此时剩下的点有(nk1)(n-k-1)个间隔,每个间隔可分可不分,所以方案数为22(nk1)2cdot 2^{(n-k-1)}
    • 出现在中间时,有(nk1)(n-k-1)种情况,此时剩下的点有(nk2)(n-k-2)个间隔,每个间隔可分可不分,所以方案数为(nk1)2(nk2)(n-k-1)cdot 2^{(n-k-2)}

    加起来即为(nk+1)2(nk2)(n-k+1)cdot2^{(n-k-2)}

    注意此处要特判3种情况

    (1)n<k
    (2)n=k
    (3)n-k-2=-1

    nk2n-k-2若更小,如为2-2,则nn已经等于kk

    AC code
    #include <cstdio>
    typedef long long LL;
    const int mod = 1e9 + 7;
    inline int qmul(int a, int b)
    {
    	int ret = 1;
    	while(b)
    	{
    		if(b & 1) ret = (LL)ret * a % mod;
    		a = (LL)a * a % mod; b >>= 1;
    	}
    	return ret;
    }
    
    int main ()
    {
    	int T, n, k;
    	scanf("%d", &T);
    	while(T--)
    	{
    		scanf("%d%d", &n, &k);
    		if(n < k) puts("0");
    		else if(n == k) puts("1");
    		else if(n == k+1) puts("2");
    		else
    		{
    			printf("%lld
    ", (LL)(n-k+3) * qmul(2, n-k-2) % mod);
    		}
    	}
    }
    
  • 相关阅读:
    批处理实现SQLServer数据库备份与还原
    Axapta物流模块深度历险(二)
    Axapta4.0Tech
    Script#
    Axapta物流模块深度历险(一)
    Agrs Class
    折半的意义
    个人性格
    诚实
    英语学习闪存
  • 原文地址:https://www.cnblogs.com/Orz-IE/p/12039452.html
Copyright © 2011-2022 走看看