hdu 2824 The Euler function(欧拉函数)

本文探讨了一种在解决特定算法问题时采用的内存优化方法,通过将大数据集分割成更小的部分来降低内存使用,同时介绍了如何计算这些数据集的有效方式。尽管此方法在理论上可行,但在实际应用中遇到了挑战,尤其是在处理大量数据时。文章最终转向了直接暴力求解策略。

如果打表的话会超内存,我想到了一种方法解决这个问题。题目给出的数据时3000000,我将三百万分成300个数据,将整万的数据存储下来,计算的时候,先计算x和y之间整万的数据,然后再计算零散数据。

想法很不错,但为啥就是通不过呢?而且看提交返回的时间来看,应该是卡在最后一两组数据上了。

我很疑惑。

代码中注释的部分是我之前的代码。最后这道题竟然是毫无美感的暴力过去了。

 

#include<stdio.h>
#include<string.h>
#define N 3000005
int a[N];
int b[N];
__int64 c[310];
int main()
{
    int i,j;
    for(i=2;i<N;i++)
        a[i]=i;
    for(i=2;i<N;i++)
    {
        if(b[i]==1)
            continue;
        a[i]=i-1;
        for(j=i+i;j<N;j=j+i)
        {
            b[j]=1;
            a[j]=a[j]/i*(i-1);
        }
    }
    a[1]=a[0]=0;
    c[1]=0;
    __int64 temp;
    c[0]=0;
    j=1;
    temp=0;
    for(i=2;i<N;i++)
    {
        temp+=a[i];
        if(i%10000==0)
            c[j++]=temp;
    }
    int x,y;
    while(scanf("%d%d",&x,&y)!=EOF)
    {
        __int64 sum=0;
        /*
        int x1,y1;
        x1=x/10000;
        y1=y/10000;
        if(x1==y1)
        {
            for(i=x;i<=y;i++)
                sum+=a[i];
        }
        else
        {
            sum+=c[y1]-c[x1];
            for(i=x1*10000+1;i<x;i++)
                sum-=a[i];
            for(i=y1*10000+1;i<=y;i++)
                sum+=a[i];
        }
        */
        for(i=x;i<=y;i++)
            sum+=a[i];
        printf("%I64d\n",sum);
    }
    return 0;
}


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值