#include<bits/stdc++.h>
using namespace std;
long long n,m,x,y,a[100010];
struct node
{
long long l,r,gcd,min,minnum;
}tree[4000010];
struct Node
{
long long min,num;
};
void build(long long x,long long l,long long r)
{
tree[x].l=l,tree[x].r=r;
if(r==l) tree[x].gcd=a[l],tree[x].min=a[l],tree[x].minnum=1;
else
{
long long mid=(l+r)/2;
build(x<<1,l,mid);
build((x<<1)|1,mid+1,r);
tree[x].gcd=__gcd(tree[x<<1].gcd,tree[(x<<1)|1].gcd);
if(tree[x<<1].min==tree[(x<<1)|1].min) tree[x].min=tree[x<<1].min,tree[x].minnum=tree[x<<1].minnum+tree[(x<<1)|1].minnum;
else {long long u=min(tree[x<<1].min,tree[(x<<1)|1].min);tree[x].min=u;tree[x].minnum=(u==tree[x<<1].min?tree[x<<1].minnum:tree[(x<<1)|1].minnum);}
}
}
Node query(long long x,long long l,long long r)
{
if(l<=tree[x].l&&tree[x].r<=r) return (Node){tree[x].min,tree[x].minnum};
else
{
Node ans1=(Node){0x3f3f3f3f,0},ans2=(Node){0x3f3f3f3f,0};
long long mid=(tree[x].l+tree[x].r)/2;
if(l<=mid) ans1=query(x<<1,l,mid);
if(mid<r) ans2=query((x<<1)|1,mid+1,r);
if(ans1.min==ans2.min) return (Node){ans1.min,ans1.num+ans2.num};
else {long long u=min(ans1.min,ans2.min);return (Node){u,ans1.min==u?ans1.num:ans2.num};}
}
}
long long Query(long long x,long long l,long long r)
{
if(l<=tree[x].l&&tree[x].r<=r) return tree[x].gcd;
else
{
long long ans1=0,ans2=0;
long long mid=(tree[x].l+tree[x].r)/2;
if(l<=mid) ans1=Query(x<<1,l,mid);
if(mid<r) ans2=Query((x<<1)|1,mid+1,r);
if(ans1==0) return ans2;
if(ans2==0) return ans1;
return __gcd(ans1,ans2);
}
}
long long ask(long long l,long long r)
{
Node mn=query(1,l,r);int gcd=Query(1,l,r);
if(mn.min==gcd) return mn.num;
else return 0;
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
build(1,1,n);cin>>m;
for(int i=1;i<=m;i++)
{
scanf("%lld%lld",&x,&y);
printf("%lld\n",y-x+1-ask(x,y));
}
return 0;
}
RT,WA on test 2,有一行应该输出0我输出了1