链接:https://ac.nowcoder.com/acm/contest/20323/A

来源:牛客网

白云在操场上运动。

白云每秒可以走1米或跑k米。

由于白云很累,它不能连续运行两秒或更长时间。

白云将从L移动到R米。它想知道有多少种不同的方式来实现它的目标。

两种方式是不同的,当且仅当他们移动不同的米或花费不同的秒,或者在一秒钟内,其中一种走,另一种跑。

输入描述:

输入的第一行包含2个整数Q和k。Q是查询数。(Q<=100000,2<=k<=100000)

对于接下来的Q行,每行包含两个整数L和R。(1<=L<=R<=100000)

输出描述:

对于每个查询,打印一行,其中包含一个整数,表示以100000007为模的查询的答案。

示例1 输入 复制 3 3 3 3 1 4 1 5 输出 复制 2 7 11

思路和心得:

(一)dp+前缀和

1.dp 2.前缀和 预计算所有的 查询的时候,需要哪段就查找哪段。

python3 代码

M = 10 ** 5 + 5        #最大的空间
MOD = 10 ** 9 + 7 

dp = [0 for _ in range(M)]

Q, k = map(int, input().split())

for i in range(k):
    dp[i] = 1
dp[k] = 2
for i in range(k + 1, M):
    dp[i] = (dp[i - 1] + dp[i - 1 - k]) % MOD

presum = [0 for _ in range(M)]
presum[0] = 1
for i in range(1, M):
    presum[i] = (presum[i - 1] + dp[i]) % MOD

for _ in range(Q):
    L, R = map(int, input().split())
    res = (presum[R] - presum[L - 1] + MOD) % MOD
    print(res)

c++代码

#include <iostream>
#include <cstring>
#include <algorithm>
#include <assert.h>
// #include <bits/stdc++.h>

using namespace std;

const int M = 1e5 + 5;
const int MOD = 1e9 + 7;
long long dp[M];

int main()
{
    std::ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    
    int Q;    cin >> Q;
    int k;    cin >> k;
    
    memset(dp, 0, sizeof(dp));
    for (int i = 0; i < k; i ++){
        dp[i] = 1;
    }
    dp[k] = 2;
    for (int i = k + 1; i < M; i ++){
        dp[i] = (dp[i - 1] + dp[i - 1 - k]) % MOD;
    }
    
    int presum[M];
    presum[0] = 1;
    for (int i = 1; i < M; i ++){
        presum[i] = (presum[i - 1] + dp[i]) % MOD;
    }
    
    for (int _ = 0; _ < Q; _ ++)
    {
        int L;    cin >> L;
        int R;    cin >> R;
        int res = (presum[R] - presum[L - 1] + MOD) % MOD;
        cout << res << endl;
        
    }
    
    return 0;
}

java代码

import java.util.*;
import java.io.*;

public class Main
{
    static final int M = (int)(1e5 + 5);
    static final int MOD = (int)(1e9 + 7);
    static long [] dp = new long [M];
    
    public static void main(String args[]) throws Exception
    {
        BufferedReader BR = new BufferedReader(new InputStreamReader(System.in));
        String [] line1 = BR.readLine().split(" ");
        int Q = Integer.parseInt(line1[0]);
        int k = Integer.parseInt(line1[1]);
        
        for (int i = 0; i < k; i ++){
            dp[i] = 1;
        }
        dp[k] = 2;
        for (int i = k + 1; i < M; i ++){
            dp[i] = (dp[i - 1] + dp[i - 1 - k]) % MOD;
        }
        
        int [] presum = new int [M];
        presum[0] = 1;
        for (int i = 1; i < M; i ++){
            presum[i] = (presum[i - 1] + (int)dp[i]) % MOD;
        }
        
        for (int ee = 0; ee < Q; ee ++)
        {
            String [] line2 = BR.readLine().split(" ");
            int L = Integer.parseInt(line2[0]);
            int R = Integer.parseInt(line2[1]);
            int res = (presum[R] - presum[L - 1] + MOD) % MOD;
            System.out.println(res);
        }
    }
}