1 #include<stdio.h> 2 #include<string.h> 3 int a[1000005],minv[1000005],num[1000005],gcdv[1000005]; 4 int gcd(int x,int y) 5 { 6 if (y==0) return x; 7 return gcd(y,x%y); 8 } 9 void build(int o,int l,int r) 10 { 11 if (l==r) {gcdv[o]=a[l]; minv[o]=a[l]; num[o]=1; return; } 12 int mid=(l+r)/2; 13 build(o*2,l,mid); build(o*2+1,mid+1,r); 14 gcdv[o]=gcd(gcdv[o*2],gcdv[o*2+1]); 15 if (minv[o*2]==minv[o*2+1]) { num[o]=num[o*2]+num[o*2+1]; minv[o]=minv[o*2]; } 16 else if (minv[o*2]<minv[o*2+1]){ num[o]=num[o*2]; minv[o]=minv[o*2]; } 17 else{ num[o]=num[o*2+1]; minv[o]=minv[o*2+1]; } 18 } 19 int query1(int o,int l,int r,int y1,int y2) 20 { 21 if (y1<=l&&y2>=r) return gcdv[o]; 22 int t1=0,t2=0,mid=(l+r)/2; 23 if (y1<=mid) t1=query1(o*2,l,mid,y1,y2); 24 if (y2>mid) t2=query1(o*2+1,mid+1,r,y1,y2); 25 if (t1==0) return t2; 26 if (t2==0) return t1; 27 return gcd(t1,t2); 28 } 29 int query2(int o,int l,int r,int y1,int y2) 30 { 31 if (y1<=l&&y2>=r) return minv[o]; 32 int t1=0x3f3f3f3f,t2=0x3f3f3f3f,mid=(l+r)/2; 33 if (y1<=mid) t1=query2(o*2,l,mid,y1,y2); 34 if (y2>mid) t2=query2(o*2+1,mid+1,r,y1,y2); 35 if (t1<t2) return t1; return t2; 36 } 37 int query3(int o,int l,int r,int y1,int y2) 38 { 39 if (y1<=l&&y2>=r) return num[o]; 40 int t1=0x3f3f3f3f,t2=0x3f3f3f3f,t3,t4,mid=(l+r)/2; 41 if (y1<=mid) { t1=query2(o*2,l,mid,y1,y2); t3=query3(o*2,l,mid,y1,y2); } 42 if (y2>mid) {t2=query2(o*2+1,mid+1,r,y1,y2); t4=query3(o*2+1,mid+1,r,y1,y2); } 43 if (t1==t2) return t3+t4; 44 else if (t1<t2) return t3; 45 else return t4; 46 } 47 int main() 48 { 49 int n,i,m,p,q,x1,x2,cnt; 50 scanf("%d",&n); 51 for (i=1;i<=n;i++) scanf("%d",&a[i]); 52 build(1,1,n); 53 scanf("%d",&m); 54 while (m--) 55 { 56 scanf("%d%d",&p,&q); 57 x1=query1(1,1,n,p,q); 58 cnt=query3(1,1,n,p,q); 59 x2=query2(1,1,n,p,q); 60 // printf("ww %d %d %d\n",x1,x2,cnt); 61 if (x1==x2) printf("%d\n",q-p+1-cnt); 62 else printf("%d\n",q-p+1); 63 } 64 }
转载于:https://www.cnblogs.com/xiao-xin/articles/4009657.html