2020牛客寒假算法基础集训营5 F 碎碎念
https://ac.nowcoder.com/acm/contest/3006/F
dp[i][0]表示到了第i句话,是前一次提交错误转移过来的
dp[i][1]表示带了第i句话,是前一次提交正确转移过来的
若前一次提交错误,那前一次的前一次肯定正确
dp[i][0]=dp[i-k][1]
若前一次提交正确,那前一次的前一次可能正确也可能错误
dp[i][1]=dp[i-1][0][dp[i-1][1];
#include<cstdio> using namespace std; #define N 100001 const int mod=1e9+7; int dp[N][2],sum[N]; int main() { int k; scanf("%d",&k); dp[0][1]=1; for(int i=1;i<N;++i) { if(i>=k) dp[i][0]=dp[i-k][1]; dp[i][1]=(dp[i-1][1]+dp[i-1][0])%mod; } for(int i=1;i<N;++i) { sum[i]=sum[i-1]; sum[i]=(sum[i]+dp[i][0])%mod; sum[i]=(sum[i]+dp[i][1])%mod; } int T,l,r; scanf("%d",&T); while(T--) { scanf("%d%d",&l,&r); printf("%d\n",(sum[r]-sum[l-1]+mod)%mod); } return 0; }