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;

}

你可能感兴趣的:(HDU)