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总不会是直接打答案吧。。。
希望有大佬解惑。。