为啥我把prime[j]>n/vis[i]
改成现在这样就好了?
void oula(int n)
{
p[1]=1;
for(int i=2;i<=n;i++)
{
if(vis[i]==0)
vis[i]=i,prime[++cnt]=i,p[i]=i-1;
for(int j=1;j<=cnt;j++)
{
if(prime[j]>vis[i] || prime[j]>n/i)
break;
vis[prime[j]*i]=prime[j];
p[i*prime[j]]=p[i]*(i%prime[j] ?prime[j]-1 :prime[j]);
}
}
}