我们需要判断是否存在 a≥1、k≥3,使得 x=a(a+1)⋯(a+k−1)。
直接预处理:枚举所有起点 a 和长度,生成不超过 109 的所有连续正整数乘积放入集合,查询时 O(1) 判断是否在集合中。
枚举上界:因为最短长度为 3,必有 a(a+1)(a+2)≤109。可知 a≲1000;而从 1 开始累乘,长度超过约 13 时已超过 109。因此预处理规模很小。
正确性:若 x 可表示为某段连续正整数乘积,则该段会在预处理枚举中出现。
小蓝在研究一类称为“链乘积数”的正整数:如果一个数可以写成至少三个连续正整数的乘积,就称它为链乘积数。例如,24=2×3×4,所以 24 是链乘积数;而 2 无法表示为至少三个连续正整数的乘积,因此不是。
现在小蓝需要进行 T 次查询,每次给出一个正整数,请你判定它是不是链乘积数。
数据范围:查询次数 T 满足 1≤T≤104,每次查询的整数 x 满足 1≤x≤109。
第一行输入一个整数 T (1≤T≤104),表示查询的次数。 接下来 T 行,每行输入一个整数 x (1≤x≤109),代表需要判断的数字。
对于每个 x,输出一行结果:如果 x 是链乘积数,输出 YES,否则输出 NO。
输入
4
1
60
120
211
输出
NO
YES
YES
NO
说明
对于 1,无法表示为至少三个连续正整数的乘积(最小的链乘积数是 1×2×3=6),故输出 NO。
对于 60,可以分解为 3×4×5=60,是三个连续正整数的乘积,故输出 YES。
对于 120,可以分解为 4×5×6=120,也是链乘积数,故输出 YES。
对于 211,它是一个质数,只能分解为 1×211,无法表示成三个或更多连续正整数的乘积,故输出 NO。
输入
3
30
210
504
输出
NO
YES
YES
说明
对于 30,它可以写成 5×6(仅两个连续正整数)或其他非连续分解,不存在长度至少为 3 的连续正整数乘积,故输出 NO。
对于 210,可以写成 5×6×7=210,是三个连续正整数的乘积,故输出 YES。
对于 504,可以写成 7×8×9=504,同样满足链乘积数的定义,故输出 YES。
输入
2
3
336
输出
NO
YES
说明
对于 3,无法表示为三个或更多连续正整数的乘积,故输出 NO。
对于 336,可以分解为 6×7×8=336,满足条件,故输出 YES。
Scan the QR code below with WeChat to sign in
First-time scan will create your account automatically
请使用微信扫描下方二维码完成注册