zoukankan      html  css  js  c++  java
  • 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
    ",sum);
        }
        return 0;
    }


  • 相关阅读:
    Bean的装配
    什么是脏读,不可重复读,幻读
    MySQL 中的数据类型介绍
    spring事务
    js:防抖动与节流
    React 之容器组件和展示组件相分离解密
    Java 里如何实现线程间通信
    线程之间的通信
    NIO之Buffer的clear()、rewind()、flip()方法的区别
    清空git缓存
  • 原文地址:https://www.cnblogs.com/snake-hand/p/3180251.html
Copyright © 2011-2022 走看看