#include<bits/stdc++.h> const int maxn=2e7+5; using namespace std; int pri[maxn],fst[maxn]; bool ispri[maxn]; long long sum[maxn]; int main () { int t; cin>>t; sum[1]=1; memset(ispri,true,sizeof(ispri)); int n=maxn-5; int tot=0; for(int i=2;i<=n;++i) { if(ispri[i]) { pri[++tot]=i; } for(int j=1;j<=tot&&i*pri[j]<=n;++j) { ispri[i*pri[j]]=0; fst[i*pri[j]]=pri[j]; if(i%pri[j]==0) break; } } for(int i=2;i<=n;++i) { if(ispri[i]) sum[i]=2; else { int t=fst[i]; long long tt=1ll*t*t*t; long long tt1=1ll*t*t; if((1ll*i)%tt==0) sum[i]=0; else if((1ll*i)%tt1==0) { sum[i]=sum[(1ll*i)/tt1]; } else { sum[i]=sum[i/t]*2; } } } for(int i=2;i<=n;++i) { sum[i]+=sum[i-1]; } while(t--) { cin>>n; cout<<sum[n]<<endl; } return 0; }
算法过程用到什么量可以记录)
高度思考