因子区间[牛客周赛44]

思路分析:

我们可以发现125是因子个数的极限了,所以我们可以用二维数组来维护第几个数有几个因子,然后用前缀和算出来每个区间合法个数,通过一个排列和从num里面选2个 ,c num 2 来计算即可

cpp 复制代码
#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;
}
相关推荐
xlq2232220 小时前
22.多态(上)
开发语言·c++·算法
666HZ66620 小时前
C语言——高精度加法
c语言·开发语言·算法
sweet丶20 小时前
iOS MMKV原理整理总结:比UserDefaults快100倍的存储方案是如何炼成的?
算法·架构
D_evil__20 小时前
[C++高频精进] 并发编程:线程基础
c++
云里雾里!21 小时前
力扣 209. 长度最小的子数组:滑动窗口解法完整解析
数据结构·算法·leetcode
Mr_WangAndy21 小时前
C++17 新特性_第二章 C++17 语言特性_std::any和string_view
c++·string_view·c++40周年·c++17新特性·c++新特性any
CoderYanger1 天前
递归、搜索与回溯-穷举vs暴搜vs深搜vs回溯vs剪枝:12.全排列
java·算法·leetcode·机器学习·深度优先·剪枝·1024程序员节
憨憨崽&1 天前
进击大厂:程序员必须修炼的算法“内功”与思维体系
开发语言·数据结构·算法·链表·贪心算法·线性回归·动态规划
水天需0101 天前
C++ 三种指针转换深度解析
c++
chem41111 天前
C 语言 函数指针和函数指针数组
c语言·数据结构·算法