hdu acm-step 2.1.6 找新朋友

    本题题意:给出一个整数n,求出小于n的所有和n互素的数的数目。

    代码如下:

    

#include <cstdio>
#include <cmath>
using namespace std;
#define Euler() \
{\
        for(int i=2;i<=sqrt(n);i++)\
        {\
                if(n%i==0)\
                {\
                        sum *= i - 1;\
                        n /= i;\
                        while(n%i==0)\
                        {\
                                sum *= i;\
                                n /= i;\
                        }\
                }\
        }\
if(n > 1)sum *= n - 1;\
}
int main()
{
        int T;
        scanf("%d",&T);
        while(T--)
        {
                int n;
                scanf("%d",&n);
                int sum=1;
                Euler();
                printf("%d\n",sum);
        }
        return 0;
}

这题真的学到了不少东西,首先是Euler函数(暴力超时,Euler 0ms).

什么叫Euler函数呢?

Euler函数的作用是用来求小于n的所有和n互素的数的数目(没错,本题就是一个裸的Euler函数)。

各种数学证明我就不说了(无奈菜鸡一个)。

然后,就是知道了为啥有些人的代码只有300甚至400B。。。

估计都是用的#define定义函数来缩减代码量...

用#define还有一个好处就是没有调用函数的开销。

时间上,空间上都有较大的提高(为了可读性我还是换了行。。)。

但是还有一点依旧不解,就是那些内存400k的代码究竟是怎么写出来的,百度说0k是利用系统bug,那400k总不会是直接打答案吧。。。

希望有大佬解惑。。

 

posted @ 2017-08-20 22:26  mtl6906  阅读(158)  评论(0编辑  收藏  举报