暴力+维护某个数到前面一个能产生不同GCD的数的位置.......
#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;
}