[蓝桥杯 2021 国 ABC] 123
题目描述
小蓝发现了一个有趣的数列, 这个数列的前几项如下:
1,1,2,1,2,3,1,2,3,4,…1,1,2,1,2,3,1,2,3,4, \ldots1,1,2,1,2,3,1,2,3,4,…
小蓝发现, 这个数列前 111 项是整数 111 , 接下来 222 项是整数 111 至 222 , 接下来 333 项是整数 111 至 333 , 接下来 444 项是整数 111 至 444 , 依次类推。
小蓝想知道, 这个数列中, 连续一段的和是多少。
输入格式
输入的第一行包含一个整数 TTT, 表示询问的个数。
接下来 TTT 行, 每行包含一组询问, 其中第 iii 行包含两个整数 lil_{i}li 和 rir_{i}ri, 表示 询问数列中第 lil_{i}li 个数到第 rir_{i}ri 个数的和。
输出格式
输出 TTT 行, 每行包含一个整数表示对应询问的答案。
样例 #1
样例输入 #1
3
1 1
1 3
5 8
样例输出 #1
1
4
8
提示
对于 10%10 \%10% 的评测用例, 1≤T≤30,1≤li≤ri≤1001 \leq T \leq 30,1 \leq l_{i} \leq r_{i} \leq 1001≤T≤30,1≤li≤ri≤100 。
对于 20%20 \%20% 的评测用例, 1≤T≤100,1≤li≤ri≤10001 \leq T \leq 100,1 \leq l_{i} \leq r_{i} \leq 10001≤T≤100,1≤li≤ri≤1000 。
对于 40%40 \%40% 的评测用例, 1≤T≤1000,1≤li≤ri≤1061 \leq T \leq 1000,1 \leq l_{i} \leq r_{i} \leq 10^{6}1≤T≤1000,1≤li≤ri≤106 。
对于 70%70 \%70% 的评测用例, 1≤T≤10000,1≤li≤ri≤1091 \leq T \leq 10000,1 \leq l_{i} \leq r_{i} \leq 10^{9}1≤T≤10000,1≤li≤ri≤109 。
对于 80%80 \%80% 的评测用例, 1≤T≤1000,1≤li≤ri≤10121 \leq T \leq 1000,1 \leq l_{i} \leq r_{i} \leq 10^{12}1≤T≤1000,1≤li≤ri≤1012 。
对于 90%90 \%90% 的评测用例, 1≤T≤10000,1≤li≤ri≤10121 \leq T \leq 10000,1 \leq l_{i} \leq r_{i} \leq 10^{12}1≤T≤10000,1≤li≤ri≤1012 。
对于所有评测用例, 1≤T≤100000,1≤li≤ri≤10121 \leq T \leq 100000,1 \leq l_{i} \leq r_{i} \leq 10^{12}1≤T≤100000,1≤li≤ri≤1012 。
蓝桥杯 2021 国赛 A 组 E 题(B 组 F 题,C 组 F 题)。
#include <bits/stdc++.h>
#define LL long long
using namespace std;
const int maxn = 1e6 + 10;
const int mod = 1e9 + 7;
const int INF = 1e9 + 10;
const int N = 1e6;
LL sum(LL i){
return i * (i + 1) * (i + 2)/6;
}
LL cal(LL x){
LL left = 0,right = INF,i;
while(left <= right){
LL mid = (left + right)/2;
if(mid * (mid + 1) /2 <= x){
left = mid + 1;
i = mid;
}
else{
right = mid - 1;
}
}
LL j = x - (i + 1) * i/2;
return sum(i) + j * (j + 1)/2;
}
int main(){
int T;
cin >> T;
LL l,r;
while(T--){
cin >> l >> r;
cout << cal(r) - cal(l - 1) << endl;
}
system("pause");
return 0;
}
该博客介绍了蓝桥杯竞赛中的一道数列求和题目,数列特点是周期性出现整数序列。博主提供了C++代码实现,利用数学公式快速计算指定范围内的数列和,解决了大规模数据下的效率问题。
1768

被折叠的 条评论
为什么被折叠?



