题目:一道难题
思路:动态规划
假如n=7,m=3,以下是dp的演化过程,[]代表[]后面的数来自[]中的数之和
代码如下:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.Arrays;
public class Main {
//快速输入
static BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
//快速输出
static PrintWriter pw=new PrintWriter(new OutputStreamWriter(System.out));
public static void main(String[] args) throws IOException {
String[] s=br.readLine().split(" ");
int p=1000000007;
int t=Integer.parseInt(s[0]);
for(;t>0;t--) {
s=br.readLine().split(" ");
int n=Integer.parseInt(s[0]);
int m=Integer.parseInt(s[1]);
long[] dp=new long[n+1];
dp[1]=1l;
//记录长度为m的块的和
long sum=1l;
//答案
long ans=2l;
//初始化第一块的值
for(int i=2;i<=Math.min(n, m);i++) {
dp[i]=(dp[i-1]*2l)%p;
sum=(sum+dp[i])%p;
ans=(ans+dp[i])%p;
}
//记录其他快元素的值
for(int i=Math.min(n, m)+1;i<=n;i++) {
dp[i]=sum;
sum=(sum+dp[i])%p;
//防止sum变成负数
sum=(sum-dp[i-m]+p)%p;
ans=(ans+dp[i])%p;
}
pw.println(ans);
}
pw.flush();
}
}