题目描述
给定 x ,y , 求 的值 .
其中 , 代表向下取整
输入描述
第一行一个正整数 T(1≤T≤100), 表示测试用例的数目。每个测试用例占一行。
接下来的 T 行,每行两个正整数 x, y 。
输出描述
输出共 T 行,每个一个正整数,表示答案。
前置知识为整除分块:可借鉴https://blog.csdn.net/qq_58207591/article/details/123883428
首先对题目分析:计算过程可以分为两部分:
第一步. 时,min(x,)=;
而可以化简为即
对下取整时我们发现恒成立即
从而可以得出 时 = =
ll i=min((ll)sqrt(x),y);//定位最大的i
while(i*i+i+1>x)
i--;
res=(1+i)*i/2; //求平均值后*i
第二步.时,按照整除分块来处理
在学到整除分块后,我们可以把约数模板按照题目修改为:
for(ll l=i+1,r; l<=y,l+1<=x; l=r+1) {
r=x/(x/(l+1))-1;
r=min(r,y);
if(l>r)
break;
res+=x/(l+1)*(r-l+1);
}