题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1215
由于此题的测试数据可能有500000个,就想到用预处理法把结果都算出来存到数组中,然而将会超时,可能原因是其测试数据没有500000组,所以不一定都得用预处理法处理
。用筛选法处理也会超时。因此可以考虑直接求解,其中一定要先开根号得出结果,在带入循环条件,否则会超时。
预处理代码:超时
#include<iostream> using namespace std; #include<time.h> #include<math.h> int a[500005]={0}; void solve() { double m; for(int j=2;j<=500000;j++) { m=(int)(sqrt(j*1.0)); for(int i=2;i<=m;i++) { if(j%i==0) { if(i*i!=j) a[j]=a[j]+i+j/i; else a[j]+=i; } } a[j]+=1; } } int main() { int t,n; //freopen("d:\\1.txt","r",stdin); solve(); cin>>t; while(t--) { cin>>n; cout<<a[n]<<endl; } //printf("%.2lf\n",(double)clock()/CLOCKS_PER_SEC); return 0; }
筛选法,超时:
#include<iostream> using namespace std; #include<math.h> int a[500005]; int solve(int n) { int i,k,m,s=0; memset(a,0,sizeof(a)); m=(int)(sqrt(n*1.0)); for(i=1;i<=m;i++) { if(n%i!=0) for(k=i;k<=m;k+=i) a[k]=1; } for(i=2;i<=m;i++) if(a[i]==0) { if(i*i!=n) s+=(i+n/i); else s+=i; } return s+1; } int main() { freopen("d:\\1.txt","r",stdin); int t,n; cin>>t; while(t--) { cin>>n; if(n==1) cout<<0<<endl; else cout<<solve(n)<<endl; } return 0; }
方法看一下代码就懂了,AC代码:
#include<iostream> using namespace std; #include<math.h> int main() { //freopen("d:\\1.txt","r",stdin); int t,n,m; scanf("%d",&t); while(t--) { cin>>n; m=(int)(sqrt(n*1.0)); int s=0; for(int i=2;i<=m;i++) { if(n%i==0) { if(i*i!=n) s=s+i+n/i; else s+=i; } } cout<<(s+1)<<endl; } return 0; }