啊啊啊啊啊,交了n遍第三题,就是不过,疯了;
先把代码贴一下 总算从tle变wa了(还真的不如我写的暴力分高)
#include<iostream> #include<cmath> #include<cstring> #include<algorithm> #include<cstdio> #include<queue> #include<map> using namespace std; #define ll long long map<int,int>ma; int rmq[30][100001]; int readin(){ int f=1,x=0;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } int gcd(int a,int b){ if(b==0)return a; else return gcd(b,a%b); } //int a[100001]; int lg[100001]; int query(int l,int r){ if(l>r) swap(l,r); int x=lg[r-l+1]; return gcd(rmq[x][l],rmq[x][r+1-(1<<x)]); } void erfen(int l,int r,int i){ if(r-l<=1){ if(l==r){ int x=query(i,r); ma[x]++; } else { int x=query(i,l); ma[x]++; int y=gcd(x,rmq[0][r]); ma[y]++; } return ; } int x=query(i,l),y=query(i,r); if(x==y){ ma[x]+=(r-l+1); return ; } int mid=(l+r+1)>>1; int t=query(i,mid); if(t==1){ ma[1]+=r-mid+1; erfen(l,mid-1,i); return ;} if(t==x){ ma[x]+=(mid-l+1); erfen(mid+1,r,i); return ; } else if(t==y){ ma[x]+=(r-mid+1); erfen(l,mid-1,i); return ; } else { erfen(mid+1,r,i); erfen(l,mid,i); return ; } } int main(){ int n=readin(); // ma[1]=0; for(int i=1;i<=n;i++){ rmq[0][i]=readin(); } for(int i=2;i<=n;i++) lg[i]=lg[i>>1]+1; for(int i=1;i<=lg[n];i++) for(int j=1;j<=n+1-(1<<i);j++) rmq[i][j]=gcd(rmq[i-1][j],rmq[i-1][j+(1<<(i-1))]); for(int i=1;i<=n;i++){ int l=i,r=n; erfen(l,r,i); } int m=readin(); ll k; while(m--){ k=readin(); cout<<ma[k]<<endl; } }