[蓝桥杯 2022 省 A] 求和

[蓝桥杯 2022 省 A] 求和

题目描述

给定 n n n 个整数 a 1 , a 2 , ⋯   , a n a_{1}, a_{2}, \cdots, a_{n} a1,a2,,an, 求它们两两相乘再相加的和,即

S = a 1 ⋅ a 2 + a 1 ⋅ a 3 + ⋯ + a 1 ⋅ a n + a 2 ⋅ a 3 + ⋯ + a n − 2 ⋅ a n − 1 + a n − 2 ⋅ a n + a n − 1 ⋅ a n S=a_{1} \cdot a_{2}+a_{1} \cdot a_{3}+\cdots+a_{1} \cdot a_{n}+a_{2} \cdot a_{3}+\cdots+a_{n-2} \cdot a_{n-1}+a_{n-2} \cdot a_{n}+a_{n-1} \cdot a_{n} S=a1a2+a1a3++a1an+a2a3++an2an1+an2an+an1an

输入格式

输入的第一行包含一个整数 n n n

第二行包含 n n n 个整数 a 1 , a 2 , ⋯ a n a_{1}, a_{2}, \cdots a_{n} a1,a2,an

输出格式

输出一个整数 S S S,表示所求的和。请使用合适的数据类型进行运算。

样例 #1

样例输入 #1

4
1 3 6 9

样例输出 #1

117

提示

对于 30 % 30 \% 30% 的数据, 1 ≤ n ≤ 1000 , 1 ≤ a i ≤ 100 1 \leq n \leq 1000,1 \leq a_{i} \leq 100 1n1000,1ai100

对于所有评测用例, 1 ≤ n ≤ 2 × 1 0 5 , 1 ≤ a i ≤ 1000 1 \leq n \leq 2\times10^5,1 \leq a_{i} \leq 1000 1n2×105,1ai1000

蓝桥杯 2022 省赛 A 组 C 题。

#include <bits/stdc++.h>
#define LL long long 
using namespace std;
const int maxn = 1e6 + 10;
const int mod = 1e9 + 7;
const int INF = 1e9 + 10;
const int N = 1e6;
LL n;
LL a[N];
LL sum[N];
int main(){
    cin >> n;
    for(LL i = 1;i <= n;i ++){
        cin >>  a[i];
        sum[i] = sum[i - 1] + a[i];
    }
    LL ans = 0;
    for(LL i = 1;i <= n;i ++){
        ans += a[i]*(sum[n] - sum[i]);
    }
    cout << ans << endl;
    system("pause");
    return 0;
}
<think>好的,我现在需要帮助用户解决一个关于蓝桥杯的C++题目,题目是“求和”。用户之前询问过如何计算两两相乘再相加的和,现在可能遇到了类似的题目,需要具体的C++实现方法。 首先,我需要回忆之前给出的解决方案。之前提到两种方法:暴力枚举和数学公式优化。由于蓝桥杯的题目通常对时间效率要求较高,暴力法可能不适合大规模数据,所以重点应该在数学公式优化上。 接下来,我需要确定用户的具体需求。用户提到的是“蓝桥杯题目A求和”,可能是指某个年份或组别的题目,但具体题目内容未给出。因此,我需要基于常见的蓝桥杯题目结构来推测可能的题目要求。通常这类题目会给出一个数组,要求计算所有两两组合的乘积之和,也就是S = a₁a₂ + a₁a₃ + ... + aₙ₋₁aₙ。 接下来要考虑的是如何将之前的数学公式转化为C++代码。之前的Python示例使用了sum和sum_sq,然后代入公式。C++的实现应该类似,但需要注意数据类型的处理,尤其是大数情况下的溢出问题。蓝桥杯的测试数据可能会很大,所以使用long long类型是必要的。 然后,我需要考虑输入输出的格式。蓝桥杯题目通常有特定的输入格式,比如第一行输入n,第二行输入n个整数。因此,代码中需要正确处理这些输入,并确保读取数据的方式正确。 另外,需要注意时间复杂度。数学公式的方法时间复杂度是O(n),可以处理1e5甚至更大的数据量,而暴力法O(n&sup2;)在n=1e5时会超时。因此,必须使用优化后的数学方法。 可能还需要考虑一些边界情况,比如n=0或1的情况,但根据题目描述,n应该是至少有两个元素的情况。不过,在代码中加入对n的判断会更稳妥,比如当n<2时直接输出0。 现在,我需要组织这些思路,形成一个结构清晰的回答。首先介绍题目,然后分析解法,接着给出C++代码示例,并解释关键点,最后进行测试验证。需要确保代码的正确性,比如使用long long类型,正确处理输入,以及应用正确的公式。 最后,需要提醒用户注意数据范围和可能的溢出问题,这是蓝桥杯题目中常见的坑点。同时,提供示例输入输出,帮助用户理解代码的运行过程。</think>### 蓝桥杯题目A "求和" 题解(C++实现) --- #### **题目描述** 给定一个长度为 $n$ 的整数数组 $a_1, a_2, \dots, a_n$,计算所有两两元素相乘的和: $$ S = a_1a_2 + a_1a_3 + \dots + a_{n-1}a_n $$ --- #### **核心思路** 直接暴力枚举时间复杂度为 $O(n^2)$,无法通过大规模数据测试(如 $n=10^5$)。 通过数学公式优化,时间复杂度可降至 $O(n)$,公式推导如下: $$ S = \frac{ \left( \sum_{i=1}^n a_i \right)^2 - \sum_{i=1}^n a_i^2 }{2} $$ --- #### **C++代码实现** ```cpp #include <iostream> using namespace std; int main() { int n; cin >> n; long long sum = 0, sum_sq = 0; // 防止溢出,用long long for (int i = 0; i < n; i++) { int x; cin >> x; sum += x; // 累加所有元素的和 sum_sq += x * x; // 累加所有元素的平方和 } long long S = (sum * sum - sum_sq) / 2; cout << S << endl; return 0; } ``` --- #### **关键点分析** 1. **时间复杂度**:仅需遍历一次数组,时间复杂度 $O(n)$。 2. **数据范围**: - 若 $a_i \leq 10^5$ 且 $n \leq 10^5$,则 `sum` 最大为 $10^{10}$,平方后为 $10^{20}$,需用 `long long` 避免溢出。 3. **输入处理**:逐项读取元素并实时累加,无需存储整个数组,节内存。 --- #### **示例测试** **输入**: ``` 3 1 2 3 ``` **计算过程**: 1. `sum = 1+2+3 = 6` → `sum^2 = 36` 2. `sum_sq = 1 + 4 + 9 = 14` 3. `S = (36 - 14) / 2 = 11` **输出**: ``` 11 ``` --- #### **适用场景** - 蓝桥杯竞赛中 $n$ 较大的情况(如 $n=10^5$)。 - 其他需要高效计算两两乘积和的场景。 --- #### **注意事项** - **数据类型**:必须使用 `long long` 类型,防止中间结果溢出。 - **边界情况**:当 $n < 2$ 时结果为 $0$,但题目通常保证 $n \geq 2$。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值