HDU1215

题目链接: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;
}
原文地址:https://www.cnblogs.com/hsqdboke/p/2480543.html