牛客寒假五 f碎碎念(dp+前缀和)

在这里插入图片描述
我们的目标是求出l到r区间可能的次序,那么我们可以确定在1到x-1的过程中一定只有一种顺序就是全部ac,也就是dp[I]=dp[I-1];只能从上一步转移过来,而在x到max的过程中每一步都有两种可能可以做到,就是上次ac和上次RJ,也就是说状态转移方程是dp[i]=dp[i-1]+dp[i-x];我们就可以得到每一步的到达方法数,之后我们发现题目设了多组提问,每次都使用加法会导致算法超时,所以我们要利用前缀和表示前i种里面的方法总和,这样每次区间询问都可以用一个减法算出,应用前缀和的性质

代码如下


#include <bits/stdc++.h>
using namespace std;
const int MAX=1e9+7;
int f[100008];
int main() {
    int k,q,l,r;
 cin>>k>>q;
        f[0]=1,f[k]=2;
        for(int i=1;i<k;i++) f[i]=1;
        for(int i=k+1;i<100008;i++) f[i]=(f[i-1]+f[i-k-1])%MAX;
        for(int i=1;i<100008;i++) f[i]=(f[i]+f[i-1])%MAX;
        while(q--)
        {
            cin>>l>>r,l--;
            printf("%d\n",(f[r]-f[l]+MAX)%MAX);
        }
    return 0;
}
发布了48 篇原创文章 · 获赞 17 · 访问量 4463

猜你喜欢

转载自blog.csdn.net/weixin_45757507/article/details/104317741
今日推荐