codeforces 474D
题意:
给
定
t
和
k
,
要
求
放
置
白
花
和
红
花
,
其
中
白
花
的
出
现
形
式
为
连
续
k
朵
。
给定t和k,要求放置白花和红花,其中白花的出现形式为连续k朵。
给定t和k,要求放置白花和红花,其中白花的出现形式为连续k朵。
t
次
询
问
,
每
次
询
问
给
定
a
和
b
,
问
区
间
[
a
,
b
]
上
符
合
要
求
的
排
花
方
案
数
。
t次询问,每次询问给定a和b,问区间[a,b]上符合要求的排花方案数。
t次询问,每次询问给定a和b,问区间[a,b]上符合要求的排花方案数。
题解:
d
p
[
i
]
表
示
长
度
为
i
的
排
花
方
案
数
,
用
s
u
m
[
i
]
维
护
区
间
[
1
,
i
]
的
前
缀
和
。
dp[i]表示长度为i的排花方案数,用sum[i]维护区间[1,i]的前缀和。
dp[i]表示长度为i的排花方案数,用sum[i]维护区间[1,i]的前缀和。
长
度
为
i
−
1
时
,
右
边
放
置
1
朵
红
花
得
到
长
度
i
。
长度为i-1时,右边放置1朵红花得到长度i。
长度为i−1时,右边放置1朵红花得到长度i。
长
度
为
i
−
k
时
,
右
边
连
续
放
置
k
朵
白
花
得
到
长
度
i
。
长度为i-k时,右边连续放置k朵白花得到长度i。
长度为i−k时,右边连续放置k朵白花得到长度i。
- d p [ i ] = ( d p [ i − 1 ] + d p [ i − k ] ) % m o d dp[i] = (dp[i-1]+dp[i-k])\%mod dp[i]=(dp[i−1]+dp[i−k])%mod
#include <bits\stdc++.h>
using namespace std;
const int mod = 1e9+7;
const int N = 100001;
long long sum[N];
long long dp[N];
int main() {
int t, k, a, b;
cin >> t >> k;
for(int i = 0 ; i <= k ; i++){
dp[i] = 1;
}
for(int i = k ; i < N ; i++){
dp[i] = (dp[i-1]+dp[i-k])%mod;
}
for(int i = 1 ; i < N ; i++){
sum[i] = (sum[i-1]+dp[i])%mod;
}
while(t--){
cin >> a >> b;
cout << (sum[b]-sum[a-1]+mod)%mod << endl;
}
return 0;
}