Codeforces Round #271 (Div. 2)D(递推,前缀和)
2024-09-27 15:11:17
很简单的递推题。d[n]=d[n-1]+d[n-k]
注意每次输入a和b时,如果每次都累加,就做了很多重复性工作,会超时。
所以用预处理前缀和来解决重复累加问题。
最后一个细节坑了我多次:
printf("%I64d\n",(s[b]-s[a-1]+mod)%mod);
这句话中加mod万万不能少,因为理论上s[b]-s[a-1]肯定大于0,但是由于两个都是模1000000007以后的结果,那么就不一定了,当s[b]-s[a-1]<0时结果是负的,不是题意中应该输出的结果,所以一定要加mod。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<map>
#include<set>
#include<vector>
#include<algorithm>
#include<stack>
#include<queue>
#include<cctype>
#include<sstream>
using namespace std;
#define INF 1000000000
#define eps 1e-8
#define pii pair<int,int>
#define LL long long int
#define mod 1000000007
LL t,k,a,b,d[],s[];
int main()
{
//freopen("in8.txt","r",stdin);
//freopen("out.txt","w",stdout);
scanf("%I64d%I64d",&t,&k);
for(int i=;i<k;i++) d[i]=;
d[k]=;
for(int i=k+;i<=;i++)
{
d[i]=(d[i-]+d[i-k])%mod;
}
s[]=;
s[]=d[];
for(int i=;i<=;i++)
{
s[i]=(s[i-]+d[i])%mod;
}
for(int i=;i<t;i++)
{
scanf("%I64d%I64d",&a,&b);
printf("%I64d\n",(s[b]-s[a-]+mod)%mod);
}
//fclose(stdin);
//fclose(stdout);
return ;
}
最新文章
- git log 常用命令及技巧
- Swift - 2.3的代码到3.0的转变
- jQuery学习笔记:attr()与prop()的区别
- .net 开源相关
- ylbtech-Unitity-CS-Arrays:数组
- 【学习笔记】【C语言】循环结构-do while
- Hql处理日期格式化问题
- redis学习-day1
- Git branch (分支学习)
- TDirectory.GetParent获取指定目录的父目录
- octopress添加回到顶部按钮
- smartassembly 使用指南
- react native调试
- td之overflow:hidden 多余文本隐藏效果
- Python3与Python2的区别汇总
- homebrew常用命令
- nginx+apache前后台搭配使用
- 初学Java Web(6)——JSP学习总结
- clCreateBuffer和clCreateBuufer + clEnqueueWriteBuffer
- Django生命周期 URL ---->; CBV 源码解析-------------- 及rest_framework APIView 源码流程解析
热门文章
- [String ] StringBuffer VS StringBuilder
- The Maximum Unreachable Node Set 【17南宁区域赛】 【二分匹配】
- Kattis - abc 【水】
- Loadrunder之脚本篇——关联函数对话框详解
- UNIX 系统常用管理命令
- 建议47:使用logging记录日志信息
- vue引入bootstrap.min.css报错:Cannot find module ";./assets/css/bootstrap.min.css";
- JVM内存的堆、栈和方法区
- CentOS 6.5 下的截图方法
- latin-1