第一题:最大公约数放的可能有点前面,这题还是使用辗转相除,除此之外还需要判断一下ab的大小顺序
#include <stdio.h>
#include <math.h>

int main() {
    long long a, b, n, c, m;
    scanf("%lld %lld", &a, &b);
    if (a > b) {
        m = a, n = b;
    } else {
        m = b, n = a;
    }
    while (b != 0) {
        c = a % b;
        a = b;
        b = c;
    }
    printf("%lld\n", m / a * n);
    return 0;
}
第二题: 第二题我觉得是最好的一题,这一题虽然也是暴力,但是相对于大家写的直接暴力还是不一样的,因为总有数字会使ab数量相近,使得不能大数除余后小数%后是最小结果。而先取得大数a的范围再进行暴力对比,对于大家会不会是一种更新的思路呢。
#include <stdio.h>

int main() {
    int n, x, y;
    scanf("%d %d %d", &n, &x, &y);
    int t = n / x;
    int res = n % y;
    for (int i = 0; i <= t; i++) {
        int temp = (n - i * x) % y;
        if (temp < res) {
            res = temp;
        }
    }
    printf("%d", res);
    return 0;
}
第三题:这应该是最简单一题,不知道大家是怎么写的,因为是质数,所以一定不能是双数,那么只要将其变成双数就好了,本体多解,我是直接输出输入了。
#include <stdio.h>

int main() {
    int n;
    scanf("%d", &n);
    printf("%d", n);
    return 0;
}

第四题:这是我意料之外的难题,因为我只看了题目,没想到其实范围这么大,超时简直是轻而易举。当然好像群里有人想用动态规划写,确实可以但却不是最适合的。
任何关于数学的题目都可以回到本质剖解,斐波那契数列有一个性质,即前 n 项的平方和可以表示为 (fibn⋅fibn+1)(fibnfibn+1),这个性质可以通过高中的数学归纳法证明。
我使用了一个递归函数 f 来计算斐波那契数列的第 x 项,并使用一个 map 来存储已经计算过的值以避免重复计算。递归的终止条件是当 x 为 1 或 2 时,直接返回 1,最后除余便可以得出答案了。
#include <stdio.h>
#include <string.h>

#define MOD 1000000007

typedef long long ll;

ll n, mod = MOD;
ll memo[100005] = {0};

ll f(ll x) {
    if (memo[x] != 0) return memo[x];
    
    ll y = x / 2;
    ll temp1, temp2;
    if (x % 2 == 0) {
        temp1 = f(y) * f(y);
        temp2 = f(y - 1) * f(y - 1);
    } else {
        temp1 = f(y) * f(y + 1);
        temp2 = f(y - 1) * f(y);
    }
    memo[x] = (temp1 + temp2) % mod;
    return memo[x];
}

int main() {
    scanf("%lld", &n);
    memo[1] = 1;
    memo[2] = 1;
    memo[3] = 2;
    ll result = (f(n) * f(n + 1)) % mod;
    printf("%lld\n", result);
    return 0;
}

第5题:这题相对而言也是简单题目了,更考虑到大家对于数组的熟练度,只需要判断相邻是否相等加1就好了。
#include <stdio.h>
#include <string.h>

#define g 1000000007

int main() {
    int t;
    scanf("%d", &t);
    while(t--) {
        char s[100005];
        scanf("%s", s);
        int x = strlen(s);
        for(int i = 0; i < strlen(s) - 1; i++) {
            if(s[i] == s[i + 1]) x++;
        }
        printf("%d\n", x);
    }
    return 0;
}

第6题:这题也是另类的贪心暴力,我们只需要关心如何免费减少就好了,那么剩下的就是付费项目(这可是另外的价钱)
#include <stdio.h>

#define MAX_SIZE 1000000009

int n, x, sum = 0;
int a[MAX_SIZE];
int main() {
    scanf("%d", &n);
    for (int i = 0; i < n; i++) {
        scanf("%d", &x);
        a[x]++;
        if (x > 0 && a[x-1] < a[x]) sum++; // 如果前一个数小于当前数,sum++
        if (x < MAX_SIZE - 1 && a[x+1] >= a[x]) sum--; // 如果后一个数大于等于当前数,sum--
    }
    printf("%d\n", sum);
    return 0;
}