D.点进来吧,这里有你想要的(简单DP)

点进来吧,这里有你想要的

Description

住在云塘校区真是太可怜了,荒郊野外,方圆一公里都没有好吃的,一般都要地铁出去

唯一幸运的是,西门中信和东门去德思勤还是有好东西吃的,比如汉堡王,金村漫漫暑训和寒假回家的时候根本就吃不到 QAQ

汉堡王长这样:在这里插入图片描述支持正版,盗版都不好吃,盗版茶颜难喝同理

汉堡王有很多好吃的小食,最好吃的当然是超大一根的薯霸王 在这里插入图片描述香脆可口的王道椒香鸡腿在这里插入图片描述 和王道川蜀鸡翅在这里插入图片描述 和鲜嫩的霸王鸡条在这里插入图片描述

当然最好吃的还是汉堡,皇堡有一层的两层的三层的,不过最好吃的还是安格斯厚牛堡(强推金沙安格斯厚牛堡可惜现在没了orz

在这里插入图片描述在这里插入图片描述
本来有好多图片的。。。。
QAQorz一回到长沙就直奔汉堡王,已知小食的美味度是1,汉堡的美味度是m,QAQorz一共能吃n美味度的东西,请问QAQorz吃一次汉堡王有几种不同的搭配方案?

关于方案:如果两个方案吃汉堡和小食的先后顺序不同,则称这两种方案是不同的

具体来说:假设一份小食用一个1表示,一个汉堡用m个0表示。当m=2时,先吃一份小食再吃一个汉堡再吃一份小食,方案表示为1001,两个方案不同当且仅当两个01串是不同的。

Input

第一行一个数t,表示t(1≤t≤15)组数据。接下来t行,每行两个数表示n和m, 1≤n≤2e5, 1≤m≤10

Output

方案数,输出答案对100000007(1e8+7)取模.

Hint

样例解释:

5种方案分别为:

吃4份小食,表示为1111

先吃一个汉堡再吃2份小食,表示为0011

先吃一份小食再吃一个汉堡再吃一份小食,表示为1001

先吃两份小食再吃一个汉堡,表示为1100

吃两个汉堡,表示为0000

所以方案数为5


#include <cstdio>
#include <cstring>
#define M 100000007
long long f[200050];
int main()
{
	int t,n,m;
	scanf ("%d",&t);
	while (t--){
		scanf ("%d%d",&n,&m);
		memset(f,0,sizeof(f));
		f[0]=1;
		for (int i=1; i<=n; i++){
			if (i>=m) f[i]=(f[i-1]+f[i-m])%M;
			else f[i]=(f[i-1])%M;
		}
		printf ("%lld\n",f[n]);
	}
	return 0;
 } 

猜你喜欢

转载自blog.csdn.net/qq_43906000/article/details/88253571