暴力枚举会超时,可以看一下性质,我可以枚举目标数有哪些因子 若两个因子(m,n)相乘之和是目标数且两个因子均小于矩阵的长度 则答案+=2(因为只用枚举到根号(目标数)即可 m * n=n * m) 注意特判能够开平方的数 这样的数有一个因子是根号(目标数) 此时答案需++;
#include<iostream>
#include<unordered_map>
#include<cmath>
using namespace std;
unordered_map<int,int> m;
const int N = 100010;
int n;
int work(int a,int b){
int res=0;
for(int i=1;i*i<b;i++){
if(b%i==0){
int x=i;
int y=b/i;
// cout<<x<<" "<<y<<endl;
if(x<=a&&y<=a){
res+=2;
}
}
}
int k=sqrt(b);
if(k*k==b) res++;
return res;
}
int main(){
cin>>n;
while(n--){
int a,b;
cin>>a>>b;
cout<<work(a,b)<<endl;
}
return 0;
}