最近做了一道北大ACM题,题目ID:3761,题目名称为Bubble Sort。惊奇的发现,我用宏定义数值常量,Runtime Error了。而如果将所有的宏定义常量转化为const 定义的常量的时候,却可以顺利的通过,这点令我很惊讶。一直以为宏定义只影响编译速度,对代码的运行速度没有影响。我唯一的猜测是,现在的CPU对变量进行了优化,将经常使用的变量放在了常用的寄存器中,从而提高了速度,然而仅仅是猜测而已。
#include <stdio.h> #define ONLINE #define SIZE 100001 #define MOD 20100713 int t; int n, k; long long fac[SIZE]; void online() { #ifdef ONLINE #else freopen("bubble.in","r", stdin); freopen("bubble.out","w", stdout); #endif } void init() { fac[0] = 1; fac[1] = 1; for (int i=2; i < SIZE; i ++) { fac[i] = fac[i-1] * i % MOD; }//end for i } long long mpow(long long p, int m) { if (m == 0) { return 1; } if (m == 1) { return p % MOD; } long long mp = mpow(p, m>>1); mp = mp * mp % MOD; if ((m&1) == 1) { mp = mp * p % MOD; } return mp; } int main() { online(); init(); scanf("%d", &t); for (int i=0; i < t; i ++) { scanf("%d%d", &n, &k); printf("%lld/n", fac[k] * (mpow(k+1, n-k)-mpow(k, n-k) + MOD) % MOD); } return 0; }
当我使用宏定义的时候,出现了Runtime Error错误。而使用常量的时候,如下:
#include <stdio.h> #define ONLINE //#define SIZE 100001 //#define MOD 20100713 const int SIZE = 1000001; const int MOD = 20100713; int t; int n, k; long long fac[SIZE]; void online() { #ifdef ONLINE #else freopen("bubble.in","r", stdin); freopen("bubble.out","w", stdout); #endif } void init() { fac[0] = 1; fac[1] = 1; for (int i=2; i < SIZE; i ++) { fac[i] = fac[i-1] * i % MOD; }//end for i } long long mpow(long long p, int m) { if (m == 0) { return 1; } if (m == 1) { return p % MOD; } long long mp = mpow(p, m>>1); mp = mp * mp % MOD; if ((m&1) == 1) { mp = mp * p % MOD; } return mp; } int main() { online(); init(); scanf("%d", &t); for (int i=0; i < t; i ++) { scanf("%d%d", &n, &k); printf("%lld/n", fac[k] * (mpow(k+1, n-k)-mpow(k, n-k) + MOD) % MOD); } return 0; }
却顺利通过了。