题目链接
解题方法:先用筛法算出每个数的质因子个数,然后统计。
题目分析
题目大意
对于任意一个数字x
,定义一个函数F(x)
,表示x
的质因子个数。对于一个闭区间[l,r]
,其中每一个数都用F(x)
表示,形成长度为r-l+1
的数组b
,问数组b
中任意两个数都存在一个最大公约数,问这个区间内最大的最大公约数是多少?
解析
因为要对每一个数字x
,找到该数对应的F(x)
,所以采用筛法求质数的方法进行标记。然后可以发现,在数据范围内,一个数最多只有7
个质因子,所以可以暴力的去搞,但是要进行1000000
次询问,每次询问要跑r-l+1
个数,这样会很慢,交了之后会T掉。找最大公约数,实际上就是找区间中出现频率大于等于2的那个数。采取使用时间换取空间的方式,用vis[maxn][8]
来记录从2
到当前i
(含)总共含有的1,2,3,4,5,6,7
的数字数量,给定一个区间[l,r]
时只需要扫v=vis[r][i]-vis[l-1][i], i∈[1,7]
即可知道[l,r]
区间内每个数出现的次数,大大降低了时间复杂度,最后一个v>=2
的i
即为答案。
代码
1 |
|