2022.5.12 亡羊补牢ing
估算一下数的组数不会超过150000,处理前2e6组的前缀和,二分找出某个位置数所在的组数和组内位置即可,注意边界问题
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=2e6+5;
const ll M=1e12+5;
ll res;
ll n=2e6;
ll c[N+10];
void init(){
for(ll i=1;i<=n;i++){
c[i]=c[i-1]+i*(i+1)/2;
}
}
int main(){
int t;cin>>t;
init();
while(t--){
res=0;
ll a,b;cin>>a>>b;
ll ai,bi,ap,bp;
ll l=0,r=n+1;
while(l<r){
ll mid=l+r>>1;
if(mid*(mid+1)/2>=a) r=mid;
else l=mid+1;
}
ai=l;ap=a-l*(l-1)/2;
l=0,r=2*N;
while(l<r){
ll mid=l+r>>1;
if(mid*(mid+1)/2>=b) r=mid;
else l=mid+1;
}
bi=l;bp=b-l*(l-1)/2;
if(ai!=bi){
res=c[bi-1]-c[ai-1];
res-=ap*(ap-1)/2;
res+=bp*(bp+1)/2;
}else{
res=bp*(bp+1)/2-ap*(ap-1)/2;
}
cout<<res<<endl;
}
}
/*
3
1 1
1 3
5 8
*/