题目链接:https://ac.nowcoder.com/acm/contest/9162#question

A. 最短逃生距离

当输入和输出的数据总数超过1000个时,建议不直接用C++的输入输出以免超时。
各种写法

# include <stdio.h>
# include <math.h>

int main() {
    int n, m;
    scanf("%d%d", &n, &m);

    while (m--) {
        int x, y;
        scanf("%d%d", &x, &y);

        printf("%d\n", abs(x - y));
    }

    return 0;
}

第二种:如果不懂原理慎用

# include <iostream>
# include <cmath>

int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);
    std::cout.tie(0);

    int n, m;
    std::cin >> n >> m;

    while (m--) {
        int x, y;
        std::cin >> x >> y;

        std::cout << abs(x - y) << "\n";
    }

    return 0;
}

第三种:手写输入输出

# include <iostream>
# include <cstdio>
# include <cmath>

template <typename T> 
void read(T &val) { 
    T x = 0; 
    int bz = 1; 
    char c; 

    for (c = getchar(); (c<'0' || c>'9') && c != '-';  c = getchar()) ; 

    if (c == '-') { 
        bz = -1; 
        c = getchar(); 
    }

    for (; c >= '0' && c <= '9'; c = getchar()) 
        x = x * 10 + c - 48; 

    val = x * bz; 
}

template <typename T>
void put(T x){  
    static char    ss[20];  
    int bas;  

    if(x < 0) {  
        putchar('-');  
        x = -x;  
    }  

    if(x == (T)(0)) {  
        putchar('0');  
        return;  
    }  

    bas = 0;  
    for(;x;x/=10) 
        ss[bas++] = x % 10 + '0';  

    for(;bas--;) 
        putchar(ss[bas]);  
}  

int main() {
    int n, m;
    read(n);
    read(m);

    while (m--) {
        int x, y;
        read(x);
        read(y);

        put(abs(x - y));
        puts("");
    }

    return 0;
}

第四种:直接读取数组(如果不懂原理慎用)

# include <iostream>
# include <cstdio>
# include <cmath>

const int BUFSIZE = 20 << 20; //40M
char Buf[BUFSIZE + 1], *buf = Buf;

template<class T>
void read(T &a) {
    int sgn = 1;
    for(a=0; *buf<'0'||*buf>'9'; buf++) if(*buf=='-') sgn = -1;
    while(*buf>='0'&&*buf<='9') {
        a=a*10+(*buf-'0');
        buf++;
    }

    a *= sgn;
}

void put(int x) {
    static char s[20];
    int bas;

    if(x < 0) {
        putchar('-');
        x = -x;
    }

    if(x == 0) {
        putchar('0');
        return;
    }

    bas = 0;
    for(; x; x/=10)
        s[bas++] = x%10+'0';

    for(; bas--;)
        putchar(s[bas]);
}

int main() {
    fread(Buf, 1, BUFSIZE, stdin);

    int n, m;
    read(n);
    read(m);
    while (m--) {
        int x, y;
        read(x);
        read(y);

        put(abs(x - y));
        printf("\n");
    }

    return 0;
}

B. spj

这题没有啥好说的,举三个例子,还有其他的写法,随便选一种 (出题人写special judge时忘记验证换行,不换行也放过了。这题不是我出的,甩锅)

# include <cstdio>

int main() {
    printf("1\n\kcxz");

    return 0;
}
# include <cstdio>

int main() {
    printf("2\n\小少爷\n宇少");

    return 0;
}
# include <cstdio>

int main() {
    printf("2\n宇少\n小少爷");

    return 0;
}

C. 突然想到一个算法

看见水群里有人斗图时发了这张图片,所以就拿这张图片当热身题。
方法一:,每一步都快速幂即可。复杂度 (斯特林公式)

# include <stdio.h>

const int mod = 1e9 + 7;

int pow(int x, int p) {
    int ans = 1 % mod;

    while (p) {
        if (p & 1) {
            ans = 1ll * ans * x % mod;
        }

        x = 1ll * x * x % mod;
        p >>= 1;
    }

    return ans;
}

void solve() {
    int n;
    scanf("%d", &n);

    int ans = n;
    for (int i = 2; i <= n; i++) {
        ans = pow(ans, i);
    }

    printf("%d\n", ans);
}

int main() {
    int T;
    scanf("%d", &T);

    while (T--) {
        solve();
    }

    return 0;
}

方法二:欧拉函数
欧拉降幂 为质数,所以互质,让阶乘模质数的欧拉函数,再快速幂。复杂度

# include <stdio.h>

const int mod = 1e9 + 7;
int phi;

int qpow(int x, int p) {
    int ans = 1 % mod;

    while (p) {
        if (p & 1) {
            ans = 1ll * ans * x % mod;
        }

        x = 1ll * x * x % mod;
        p >>= 1;
    }

    return ans;
}

int fphi(int n) {
    int ans = n;
    for (int i = 2; i <= n / i; i++) {
        if (n % i == 0) {
            ans = ans / i * (i - 1);

            while (n % i == 0) {
                n /= i;
            }
        }
    }

    if (n > 1) {
        ans = ans / n * (n - 1);
    }

    return ans;
}

void solve() {
    int n;
    scanf("%d", &n);

    int ans = 1;
    for (int i = 2; i <= n; i++) {
        ans = 1ll * ans * i % phi;
    }

    printf("%d\n", qpow(n, ans));
}

int main() {
    int T;
    scanf("%d", &T);
    phi = fphi(mod);

    while (T--) {
        solve();
    }

    return 0;
}

D. 兀兀的请求

。C语言的库函数里面 写作 。部分编译器无法通过,需要写成

# include <stdio.h>
# include <math.h>

typedef long long ll;

int main() {
    double ans = acos(-1.0);
    ans = ans * 100;

    for (int i = 3; i <= 14; i++) {
        ans = ans * 10;
        ll t = ans;
        printf("%lld", t % 10);
    }

    return 0;
}

用参考公式算到第14位极有可能会出现问题