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;
}

猜你喜欢

转载自www.cnblogs.com/TheRoadToTheGold/p/12304935.html