题目链接
解题方法:先用筛法算出每个数的质因子个数,然后统计。
题目分析
题目大意
对于任意一个数字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 |
|