ZOJ 3725 Painting Storages

采用递推:当N<M时,必不存在满足条件的方法,因而结果为0;N=M时,方案数恰好为1。N>M时,若1到N-1满足条件,则N可以任意染色,方案数为C(N-1)*2;否则,必有1到N-M-1不满足条件,N-M为蓝,N-M+1到N-1为红,这时将N染成红色即可,方案数为2^(N-M-1)-C(N-M-1),即1到N-M-1所有的染色方案数减去满足条件的方案数。

#include <cstdio>
#include <memory.h>
#define mod 1000000007
typedef long long ll;

ll pow2[100000];
ll iter[100001];
int main()
{
	int n, m;
	*pow2 = 1;
	for(int i=1; i<100000; ++i)
		pow2[i] = (pow2[i-1]*2)%mod;
	while(~scanf("%d%d", &n, &m))
	{
		if(n < m)
			printf("0\n");
		else if(n == m)
			printf("1\n");
		else
		{
			memset(iter, 0, m*sizeof(ll));
			iter[m] = 1;
			for(int i=m+1; i<=n; ++i)
				iter[i] = (2*iter[i-1]+pow2[i-m-1]-iter[i-m-1]+mod)%mod;
			printf("%lld\n", iter[n]);
		}
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值