题目来源
2021年蓝桥杯国赛F题
题目链接:http://acm.mangata.ltd/p/P1505
考点前缀和、初中数学
视频讲解视频连接:https://www.bilibili.com/video/BV1cL411w7eB/
思路我们可以怎么考虑这个事情呢,我们会发现这个序列就是数量不断上升的一个等差数列,我们只需要预处理出每一段长度的一个和,然后我们求一个区间到[0,R]的一个和,因为我们与处理过,所以这个O(1)就能得出,然后再求一下[0,L-1]的一个区间和,那么我们相减就是我们所需要的答案了,注意的是这里的L和R不一定刚好都是完整区间,所以我们还得处理一下边角的情况,关于前缀和的知识请查看:
https://www.bilibili.com/video/BV1xq4y1y7Kz
代码实现#include
using namespace std;
//----------------自定义部分----------------
#define ll long long
#define mod 1000000009
#define endl "\n"
#define PII pair
int dx[4]={0,-1,0,1},dy[4]={-1,0,1,0};
ll ksm(ll a,ll b) {
ll ans = 1;
for(;b;b>>=1LL) {
if(b & 1) ans = ans * a % mod;
a = a * a % mod;
}
return ans;
}
ll lowbit(ll x){return -x & x;}
const int N = 1e7+10;
//----------------自定义部分----------------
ll n,m,q,a[N],pre[N];
int main()
{
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cout.tie(nullptr);
n = 10000000;
ll res = 0;
for(int i = 1;i >t;
ll l,r;
while(t--){
cin>>l>>r;
ll ans = 0;
//计算的是[0,R]这段区间的和
//计算的完整区间的前缀和
ll lenr = (sqrt(1+8.0*r)-1)/2LL;
ans = pre[lenr];
r -= ((lenr+1)*lenr)/2;
//计算的是不完整的
ans += ((r+1)*r)/2LL;
//计算的是[0,L-1]这段区间的和
l--;
//计算的完整区间的前缀和
ll lenl = (sqrt(1+8.0*l)-1)/2LL;
ans -= pre[lenl];
l -= (lenl+1)*lenl/2LL;
//计算的是不完整的
ans -= ((l+1)*l)/2LL;
cout
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?