题目大意:给出两整数l,r,要求构造a数组,每个数都不同且在区间[l,r]之间,且任意两个数之间都有整除关系,问符合这些条件的数组的最大长度,以及该长度下满足条件的数组个数
1<=t<=2e4;1<=l<=r<=1e6
思路:既然要数字最多,那么我们按照贪心的思想,先选l作为第一个数,然后后面每一个数都是前一个数*2那么最大长度m就是+1这样的数组的l的取值范围就是从l到r/2^(m-1),那么这样的数组的数量就是r/2^(m-1)-l+1,然后我们发现在*两次2之间还有可能是*一次3,因为*3是小于*4的,所以我们对于之前求出的一个合法数组,可以把任意位置上的*2替换为*3都是合法的,那么这样的数组的l的取值范围就是从l到r/2^(m-1)*2/3,对于每一个l,都有(m-1)种合法的替换,因为*其他数都不比*两个2或*1个3更优,所以答案就是这两种情况下的答案相加
//#include<__msvc_all_public_headers.hpp>
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MOD = 998244353;//实际上答案没有这么大,完全不用取模,还能这么增加难度?
int main()
{
cin.tie(0);
cout.tie(0);
ios::sync_with_stdio(false);
int t;
cin >> t;
while (t--)
{
ll l, r;
cin >> l >> r;
ll l2 = l;
ll m = 1;//数组的初始长度为1
while (l2*2 <= r)
{//取log2
l2 *= 2;
m++;
}
ll ans = 0;
ll temp2 = r / (1 << (m - 1));//都是*2时,最小元素的最大值
if (temp2 >= l)
{
ans += temp2 - l + 1;
}
ll temp = r / (3 * (1 << (m - 2)));//有一个*3时,就*一个2在/3
if (temp >= l)
{
ans += (temp - l + 1)*(m-1);//每一个数组都有m-1个位置可以放*3
}
cout << m << " " << ans << endl;
}
return 0;
}