牛客网暑期ACM多校训练营(第二场)A run

通过画图可以发现,dp[i]可以从dp[i-1]走过来,或者dp[i-k]跑过来

因为不能连续跑,所以每次都要-1

前面几次都没有过,原因是忘记了取模!!!!!!!!(相加的时候取模,相间的时候就不必了,因为可能出现结果为负)

#include<bits/stdc++.h>
using namespace std; 
typedef long long ll; 
#define  Max  int(1e5+10)
struct query
{
    ll l,r;
}q[Max];
ll sum[Max],dp[Max];
int main()
{
  ll p,k;
  while(~scanf("%lld%lld",&p,&k))
       {
          ll ma=0,x,y;
          for(int i=1;i<=p;i++)
             {
               scanf("%lld%lld",&x,&y);
               ma=max(ma,y);
               q[i].l=x;
               q[i].r=y;       
             }
            memset(dp,0,sizeof dp);
            memset(sum,0,sizeof sum);
          for(int i=1;i<k;i++)
          {
             dp[i]=1;  
             sum[i]=(sum[i-1]%1000000007+dp[i]%1000000007)%1000000007;
          }   
          dp[k]=2;
          sum[k]=(sum[k-1]%1000000007+2)%1000000007;
          for(ll i=k+1;i<2*k;i++)
             {
                dp[i]=(dp[i-1]%1000000007+dp[i-k]%1000000007)%1000000007;
                sum[i]=(sum[i-1]%1000000007+dp[i]%1000000007)%1000000007;
             }
          for(ll i=2*k;i<=ma;i++)
             {
                dp[i]=(dp[i-1]%1000000007+dp[i-k]%1000000007-1)%1000000007;
                sum[i]=(sum[i-1]%1000000007+dp[i]%1000000007)%1000000007;
             }
             //for(int i=1;i<=ma;i++)
              //  cout<<dp[i]<<endl;
             for(ll i=1;i<=p;i++)
              printf("%lld\n",(sum[q[i].r]-sum[q[i].l-1]+1000000007)%1000000007);
                              
        
}}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值