第一题:最大公约数放的可能有点前面,这题还是使用辗转相除,除此之外还需要判断一下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)(fibn⋅fibn+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; }