Codeforces 475 D. CGCDSSQ


暴力+维护某个数到前面一个能产生不同GCD的数的位置.......

D. CGCDSSQ
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

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.

Input

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).

Output

For each query print the result in a separate line.

Sample test(s)
input
3
2 6 3
5
1
2
3
4
6
output
1
2
2
0
1
input
7
10 20 3 15 1000 60 16
10
1
2
3
4
5
6
10
20
60
1000
output
14
0
2
2
2
0
2
2
1
1


#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <map>

using namespace std;

typedef long long int LL;

const int maxn=100100;

map<int,LL> ans;
int a[maxn],n,m;
int pre[maxn];

int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d",a+i);
    for(int i=1;i<=n;i++)
    {
        pre[i]=i-1;
        int x=a[i],xi=i;
        for(int j=i;j;j=pre[j])
        {
            a[j]=__gcd(a[j],x);
            ans[a[j]]+=j-pre[j];
            if(a[j]<x)
            {
                pre[xi]=j;
                xi=j; x=a[j];
            }
        }
        pre[xi]=0;
    }
    scanf("%d",&m);
    while(m--)
    {
        int x;
        scanf("%d",&x);
        printf("%I64d\n",ans[x]);
    }
    return 0;
}




posted @ 2017-06-05 20:13  yangykaifa  阅读(155)  评论(0编辑  收藏  举报