解题思路
本题要求统计连续子段的乘积 M 满足正因子个数 d(M)≥k 的个数。随着子段长度增加,乘积的质因子指数只增不减,由约数个数定理 d(M)=∏(ei+1) 可知因子个数具有单调性。因此可以使用双指针(滑动窗口)高效计算。
具体算法步骤:
- 预处理每个数的质因数分解
- 限定数值范围 MAX=200005。
- 类似埃氏筛的思想,从小到达枚举每个质数 p,利用已分解的结果递推其倍数 x 的分解。
题目内容
在数据科学领域,分析师经常需要挖掘序列中隐藏的数值特性。对于一个长度为 n 的正整数序列 x1,x2,…,xn,考虑它的任意一个连续子段 xl,xl+1,…,xr (1≤l≤r≤n)。
定义该子段的乘积 M=∏i=lrxi,并用 d(M) 表示 M 的正因子个数(即能整除 M 的正整数的数目)。你的任务是统计满足 d(M)≥k 的连续子段 (l,r) 的总个数。
关于计算正因子个数,可以利用经典的约数个数定理:若 M 的质因数分解为 M=p1e1p2e2⋯ptet,则 d(M)=(e1+1)(e2+1)⋯(et+1)。
序列的长度 n 不超过 2×105,阈值 k 不超过 109。序列中每个数 xi 均为不超过 2×105 的正整数。
输入描述
第一行包含两个整数 n 和 k,用空格分隔。
第二行包含 n 个整数,依次表示 x1,x2,…,xn,相邻整数之间用空格分隔。
输出描述
输出一个整数,表示满足 d(M)≥k 的连续子段个数。
样例1
输入
4 3
2 6 1 3
输出
6
说明
序列为 [2,6,1,3],阈值 k=3。
枚举所有连续子段并计算乘积的正因子个数 d(M):
- [2]:M=2=21,d(M)=1+1=2<3;
- [2,6]:M=12=22×31,d(M)=(2+1)(1+1)=6≥3;
- [2,6,1]:1 不影响乘积,d(M)=6≥3;
- [2,6,1,3]:M=36=22×32,d(M)=(2+1)(2+1)=9≥3;
- [6]:M=6=21×31,d(M)=4≥3;
- [6,1]:d(M)=4≥3;
- [6,1,3]:M=18=21×32,d(M)=2×3=6≥3;
- [1]:M=1,d(M)=1<3;
- [1,3]:M=3,d(M)=2<3;
- [3]:M=3,d(M)=2<3。
满足条件的子段共有 6 个。
样例2
输入
1 5
16
输出
1
说明
序列只有一个元素 16,阈值 k=5。
M=16=24,其正因子个数 d(M)=4+1=5,满足 d(M)≥5。唯一的子段 [16] 计入答案,故输出 1。
样例3
输入
3 1
5 7 11
输出
6
说明
序列为 [5,7,11],阈值 k=1。
任何正整数的正因子个数 d(M)≥1 恒成立,因此所有连续子段均满足条件。长度为 3 的序列共有 3×4/2=6 个连续子段,答案为 6。