Given a sequence of integers a1, ..., an and q queries x1, ..., xq on it. For each query xi you have to count the number of pairs (l, r) such that 1 ≤ l ≤ r ≤ n and gcd(al, al + 1, ..., ar) = xi.
is a greatest common divisor of v1, v2, ..., vn, that is equal to a largest positive integer that divides all vi.
The first line of the input contains integer n, (1 ≤ n ≤ 105), denoting the length of the sequence. The next line contains n space separated integers a1, ..., an, (1 ≤ ai ≤ 109).
The third line of the input contains integer q, (1 ≤ q ≤ 3 × 105), denoting the number of queries. Then follows q lines, each contain an integer xi, (1 ≤ xi ≤ 109).
For each query print the result in a separate line.
3 2 6 3 5 1 2 3 4 6
1 2 2 0 1
7 10 20 3 15 1000 60 16 10 1 2 3 4 5 6 10 20 60 1000
14 0 2 2 2 0 2 2 1 1
#include <algorithm> #include <cstring> #include <cstdio> #include <map> using namespace std; int N, M; map<int, long long>S, A; int gcd( int a, int b ) { return b==0?a:gcd( b, a%b ); } int main() { int i, x; scanf( "%d", &N ); for( i=0;i<N;i++ ) { scanf( "%d", &x ); S[x]++; map<int, long long>T; map<int, long long>::iterator it; for( it=S.begin();it!=S.end();it++ ) { int com=gcd( it->first, x ); T[com]+=it->second; A[com]+=it->second;//A[com]表示最大公约数com的组数 } S=T;// T表示 加入x后 从前面任意位置到x这个位置时,有几个不同的最大公约数(T->first), 以及各个的组数(T->second) } scanf( "%d", &M ); while( M-- ) { scanf( "%d", &x ); printf( "%I64d\n", A[x] ); } return 0; }