Problem Description
Give you a sequence of
N(N≤100,000) integers :
a1,...,an(0<ai≤1000,000,000). There are
Q(Q≤100,000) queries. For each query
l,r you have to calculate
gcd(al,,al+1,...,ar) and count the number of pairs
(l′,r′)(1≤l<r≤N)such that
gcd(al′,al′+1,...,ar′) equal
gcd(al,al+1,...,ar).
Input
The first line of input contains a number
T, which stands for the number of test cases you need to solve.
The first line of each case contains a number
N, denoting the number of integers.
The second line contains
N integers,
a1,...,an(0<ai≤1000,000,000).
The third line contains a number
Q, denoting the number of queries.
For the next
Q lines, i-th line contains two number , stand for the
li,ri, stand for the i-th queries.
Output
For each case, you need to output “Case #:t” at the beginning.(with quotes,
t means the number of the test case, begin from 1).
For each query, you need to output the two numbers in a line. The first number stands for
gcd(al,al+1,...,ar) and the second number stands for the number of pairs
(l′,r′) such that
gcd(al′,al′+1,...,ar′) equal
gcd(al,al+1,...,ar).
Sample Input
1 5 1 2 4 6 7 4 1 5 2 4 3 4 4 4
Sample Output
Author
HIT
Source
2016 Multi-University Training Contest 1
Recommend
wange2014 | We have carefully selected several similar problems for you: 5733 5732 5731 5730 5729
题意:给你一个序列,有一些询问,每次问你一个区间的所有数的GCD是多少,还有这个GCD在整个区间出现的次数是多少。
分析:RMQ可以很容易的解决区间GCD的询问,关键是求出这个值在整个区间出现的次数,注意到1000000000的因数的个数是log级别的,所以我们可以枚举区间左端点来二分右端点,这样预处理出每个GCD出现的次数。
#include