当左端点为i时,用map[i+1]来更新map(i)即可.
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=2e5+5; int n,a[N]; int gcd(int a,int b) { return b==0?a:gcd(b,a%b); } map<int,ll>res,now,nxt; void work() { map<int,ll>::iterator it; for(int i=n;i>=1;i--) { now.clear(); now[a[i]]++; for(it=nxt.begin();it!=nxt.end();it++) { int d=gcd(a[i],it->first); now[d]+=it->second; } for(it=now.begin();it!=now.end();it++) res[it->first]+=it->second; swap(now,nxt); } } int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); work(); int Q,x; scanf("%d",&Q); while(Q--) { scanf("%d",&x); printf("%I64d\n",res[x]); } return 0; }