【五边形定则应用2】HDU 4602——Partition

来源: 点击打开链接(MU1)
发现多校很喜欢考整数划分的问题。与 点击打开链接4651一样,用找规律的方式也可以找出来,p(1,k):1 (k从1至n)  p(2,k):2,1 p(3,k):5,2,1 p(4,k):12,5,2,1  p(5,k):28,12,5,2,1……
 p(n,1)= 2*f(n-1)+2^(n-3) 
p(n,k)= a_n = 2^(n-1) + (n-2)*2^(n-3);    n就是n,k的差么。。。。没错.
整数划分看来成为热门了。。。学到了
#include<cstdio>

#include<cstring>

#include<iostream>

#pragma comment(linker, "/STACK:1024000000,1024000000")

using namespace std;



const long long MOD=1e9+7;



long long power_2(long long n)

{

	if(n==0)

		return 1;

	if(n==1)

		return 2;

	long long diver=power_2(n/2);

	if(n%2==1)

	{

		return (diver*diver*2)%MOD;

	}

	else if(n%2==0)

		return (diver*diver)%MOD;

}



int main()

{

	int testcase;

	cin>>testcase;

	while(testcase--)

	{

		int tarnum,shownum;

		cin>>tarnum>>shownum;

		int p=tarnum-shownum+1;

		if(p<=0)

		{

			cout<<0<<endl;

		}

		else if(p==1)

		{

			cout<<1<<endl;

		}

		else

		{

			long long res=(power_2(p-1)+(p-2)*power_2(p-3))%MOD;

			cout<<res<<endl;

		}

	}

	return 0;

}


 

你可能感兴趣的:(partition)