思路分析:
我们可以发现125是因子个数的极限了,所以我们可以用二维数组来维护第几个数有几个因子,然后用前缀和算出来每个区间合法个数,通过一个排列和从num里面选2个 ,c num 2 来计算即可
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#define int long long
using namespace std;
int n,m;
int w[100005];
int cnt[1000005][150];
signed main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>w[i];
int num=0;
for(int j=1;j*j<=w[i];j++){
if(w[i]%j==0) num+=2;//计算因子数
if(w[i]==j*j) num-=1;
}
cnt[i][num]=1;
//第i位置上的数有num个因子,这种情况存在,记作1
}
for(int i=1;i<=n;i++)
for(int j=1;j<=130;j++){
cnt[i][j]+=cnt[i-1][j];//前缀和
}
while(m--)
{
int ans=0;
int a,b;
cin>>a>>b;
for(int i=1;i<=130;i++)
{
int sum=cnt[b][i]-cnt[a-1][i];
if(sum)
ans+=sum*(sum-1)/2;//组合数
}
cout<<ans<<endl;
}
return 0;
}