mu[1]=1;
for(int i=2;i<=1000000;i++){
if(!pr[i])mu[pr[++cnt]=i]=-1;
for(int j=1;j<=cnt&&(long long)i*pr[j]<=1000000;j++){
pr[i*pr[j]]=1;
if(i%pr[j])mu[i*pr[j]]=-mu[i];
else break;
}
}
int n;
long long l,r;
long long lt,len;
scanf("%d",&n);
while(n--){
cin>>l>>r;
if(l<=1000000){
lt=min(r,1000000ll);
for(int i=l;i<=lt;i++){
if(!mu[i])putchar('0');
else if(~mu[i])putchar('+');
else putchar('-');
}
putchar('\n');
if(r<=1000000)continue;
l=1000001;
}
len=r-l+1;
for(int i=len;i;i--)g[i]=1,v[i]=1;
for(int i=cnt;i;i--)
for(int j=(l+pr[i]-1)/pr[i]*pr[i]-l+1;j<=len;j+=pr[i])
if((l+j-1)/pr[i]%pr[i]){
if(g[j])g[j]=-g[j],v[j]*=pr[i];
else g[j]=0;
}
for(int i=1;i<=len;i++){
int x=(i+l-1)/v[i];
if(g[i]&&(i+l-1)^v[i]&&isp(x))
g[i]=-g[i];
else{
int y=sqrt(x);
if(y*y==x)g[i]=0;
}
if(!g[i])putchar('0');
else if(~g[i])putchar('+');
else putchar('-');
}
putchar('\n');
}
后两个点 wa 了。