牛客网暑期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);
                              
        
}}

猜你喜欢

转载自blog.csdn.net/pinkair/article/details/81155764
今日推荐