试题来源
2012中国国家集训队命题答辩
问题描述
给定一长度为n的正整数序列a,有q次询问,每次询问一段区间内所有数的lcm(即最小公倍数)。由于答案可能很大,输出答案模1000000007。
输入格式
第一行,两个整数,n, q,分别表示数列长度和询问个数。
下面n行,每行一个整数,第i行的整数为ai。
下面q行,每行两个整数l, r,表示询问下标i在[l, r]范围内的ai的lcm。
输出格式
q行。对于每个询问,输出一行,表示对应的答案。
样例输入
3 3
123
234
345
1 2
2 3
1 3
样例输出
9594
26910
1103310
数据规模和约定
测试数据编号 | 规模和约定 |
---|---|
1, 2 | n, q<=1000 |
3, 4 | n, q<=5000 |
5, 6 | n, q<=20000 |
7, 8 | n, q<=30000 |
9, 10 | n, q<=40000 |
11, 12 | n, q<=50000 |
13, 14 | n, q<=80000 |
15, 16 | n, q<=100000 |
17, 18, 19, 20 | n, q<=100000 数列a中每个数能表示为不超过100的素数的积 |
对于所有测试点,数列a中每个数满足1<=ai<=1000000000。
求LCM会爆LL,所以可以考虑分解质因数然后求最大幂然后乘起来。
40分算法:
对于最后四个点:
考虑对每个素数的幂建一个ST表,则答案是每个素数的幂的区间最大值,乘起来就行了。复杂度 O(25∗nlogn+25q) 。
对于前四个点:
暴力分解质因数,求最大的幂。复杂度 O(nqlogn) 。
60分算法:
考虑离线莫队。发现每次区间转移相当于删除/加入log个质数,最后询问是询问每个质数的最大的幂,可以用平衡树来维护,复杂度