暴力+维护某个数到前面一个能产生不同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 ",ans[x]); } return 0; }