题解:B4252 [科大国创杯小学组 2024] 代数

· · 题解

B4252 [科大国创杯小学组 2024] 代数 题解

题目传送门

分析

一道模拟题,考察对数组和循环结构的运用。

题意:给定序列 a,b 和序列长度 n,求 a_1\times b_1+a_2\times b_2+...+a_n\times b_n

用数组和循环结构实现即可。

很容易写出代码:

#include <stdio.h>
const int N = 1000005;
int n, a[N], b[N], sum;
signed main(void) {
    scanf("%d", &n);
    for (int i = 1; i <= n; ++i) scanf("%d", &a[i]);
    for (int i = 1; i <= n; ++i) scanf("%d", &b[i]);
    for (int i = 1; i <= n; ++i) sum += a[i] * b[i];
    printf("%d", sum);
    return 0;
}

但是,交上去之后只得了 60 分,我们发现 1000000\times 1000000=1000000000000=10^{12},爆 int,要使用 long long 类型(最大点积为 (10^6)^3= 10^{18},不会炸)。

AC code

#include <stdio.h>
const int N = 1000005; int n, a[N], b[N]; long long sum;
signed main(void) {
    scanf("%d", &n);
    for (int i = 1; i <= n; ++i) scanf("%d", &a[i]);
    for (int i = 1; i <= n; ++i) scanf("%d", &b[i]);
    for (int i = 1; i <= n; ++i) sum += 1ll * a[i] * b[i];
    printf("%lld", sum);
    return 0;
}

事实上我们可以把 b 数组压掉,一读入就计算,加入 sum

#include <stdio.h>
int n, a[1000005]; long long sum;
signed main(void) {
    scanf("%d", &n);
    for (int i = 1; i <= n; ++i) scanf("%d", &a[i]);
    for (int i = 1, b; i <= n; ++i) scanf("%d", &b), sum += 1ll * a[i] * b;
    printf("%lld", sum);
    return 0;
}