题目:
思路:
由a/b(↓)=a%b得a=(a/b(↓))b+a%b。令k=a%b < b。则a=kb+k=(b+1)*k。
由于k<b<b+1,则a=(b+1)*k>k^2。 可得k^2<a<=x。于是k得最大取值即10的4.5次方 可以枚举k。 若枚举了k
确定b的值相应a也确定。也即求出b的个数即可。 b的最小取值为k+1,因为k<b。 b的最大取值为min(y,x/k(↓)-1)
推导最大取值: 首先b<=y。其次 1<=a<=x 得1<=k(b+1)<=x 得1/k-1<=b<=x/k-1。
由于1/k-1<0 则取1<=b。 所以b∈(k,min(x/k(↓)-1,y)]。
即b得取值个数为max(0LL,min(x/k(↓)-1,y)-k) //0防止减出负数
代码:
#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cmath>
#include<stdlib.h>
using namespace std;
typedef long long ll;
int main(){
ll x,y;
int t;
cin >> t;
while(t--){
scanf("%lld%lld",&x,&y);
ll res = 0;
for(int k = 1;k <= sqrt(x);k++) res += max(0LL,min(x/k-1,y)-k);
printf("%lld\n",res);
}
return 0;
}