题目链接 蓝桥杯2021年第十二届国赛真题-123
显而易见,二分范围在int内,但如果把二分模板中的l,r,mid从long long改为int就会出错。
我感觉是int和longlong运算出的错,但是也只是感觉,真是莫名其妙的。
错误的代码:
#include<iostream>
using namespace std;
long long sum(long long x)
{
if(x == 0) return 0;
int l = 1,r = 2e6; //改longlong
while(l < r)
{
int mid = l + r + 1 >> 1; //改longlong
if(x >= mid * (mid + 1) / 2) l = mid;
else r = mid - 1;
}
long long a = l * (l + 1) / 2 * (l + 1) - l * (l + 1) * (2 * l + 1) / 6;
x -= l * (l + 1) / 2;
a += x * (x + 1) / 2;
return a;
}
int main()
{
int t = 0;
scanf("%d",&t);
while(t--)
{
long long l = 0,r = 0;
scanf("%lld%lld",&l,&r);
printf("%lld\n",sum(r) - sum(l - 1));
}
return 0;
}
提问于21天前
21980