思路分析:
我们可以发现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;
}