#include<bits/stdc++.h> #define MAXN 300005 #define MAXM 35 #define int long long usingnamespace std; inlineintread(){ int x=0,f=1; char ch=getchar(); while (ch<'0'||ch>'9'){ if (ch=='-') f=-1; ch=getchar(); } while (ch>='0'&&ch<='9'){ x=(x<<3)+(x<<1)+(ch^'0'); ch=getchar(); } return x*f; } int n; int q[MAXN],a[MAXN]; map<int,int>ans; namespace ST_table{ int st[MAXM][MAXN],lg[MAXN]; inlinevoidInit_ST(){ lg[0]=-1; for (registerint i=1;i<=n;++i){ lg[i]=lg[i>>1]+1; } for (registerint i=1;i<=n;++i){ st[0][i]=a[i]; } for (registerint i=1;i<MAXM;++i){ for (registerint j=1;j+(1<<i)-1<=n;++j){ st[i][j]=__gcd(st[i-1][j],st[i-1][j+(1<<(i-1))]); } } } inlineintQuery(int l,int r){ if (l>r) return0; int k=lg[r-l+1]; return __gcd(st[k][l],st[k][r-(1<<k)+1]); } } usingnamespace ST_table; inlineintFind(int L,int p,int g){ int l=p,r=n,ans=0; while (l<=r){ int mid=(l+r)>>1; if (Query(L,mid)==g) ans=mid,l=mid+1; else r=mid-1; } return ans; } inlineintCalc(int p){ int now=a[p],L=p; while (true){ int lst=p; p=Find(L,p,now); ans[now]+=p-lst+1; if (p==n) return0; ++p; now=Query(L,p); } } #undef int intmain(){ #define int long long n=read(); for (registerint i=1;i<=n;++i) a[i]=read(); int m=read(); for (registerint i=1;i<=m;++i) q[i]=read(); Init_ST(); for (registerint i=1;i<=n;++i) Calc(i); for (registerint i=1;i<=m;++i){ printf("%I64d\n",ans[q[i]]); } }