蓝桥杯2022年第十三届省赛真题-求和 - C语言网 (dotcpp.com)
2080 蓝桥杯 求和 困难
//暴力法只能通过30%,把N改大也一样
#include <bits/stdc++.h> //C风格求解
const int N = 1e3 + 10; //科学计数法 1*10^3+10
int a[N];
int main(){
int n;
scanf("%d",&n);
for(int i = 1; i <= n; i++){
scanf("%d",&a[i]);
}
int ans = 0; //改成long long也一样
for(int i = 1; i <= n; i++){
for(int j = i + 1; j <= n; j++){
ans += a[i] * a[j];
}
}
printf("%d\n",ans);
}
(a1+a2+a3)^2 = a1^2 + a2^2 + a3^3 + 2a1a2 + 2a1a3 + 2a2a3
(a1+...+an)^2 = a1^2 + ... + an^2 + 2(a1a2 +... + a1an + ... + an-1a1
+ ... + an-2an-1+ an-2an + an-1an)
S = a1a2 +... + a1an + ... + an-1a1 + ... + an-2an-1+ an-2an + an-1an
int的范围10^9,S的范围:1000 * 1000 * (2 * 10^5) * (2 * 10^5) = 4 * 10^16
a的范围 n的范围
(a1+...+an)^2 = a1^2 + ... + an^2 + 2S
//C风格求解改进版1,多项式平方公式,通过率100%,可以全是long long,一般不卡空间
#include <bits/stdc++.h>
const int N = 2e5 + 10; //根据题目修改测评数据N的范围
int a[N];
int main(){
int n;
scanf("%d",&n);
for(int i = 1; i <= n; i++){
scanf("%d",&a[i]);
}
long long ans = 0, sum = 0; //调整取值范围
for(int i = 1; i <= n; i++){
sum += a[i];
}
ans = sum * sum;
for(int i = 1; i <= n; i++){
ans -= a[i]*a[i];
}
ans /= 2;
printf("%lld\n",ans); //修改类型
}
S = a1a2 +... + a1an + ... + an-1a1 + ... + an-2an-1+ an-2an + an-1an
= a1(a2+..+an) + ... + an-2(an-1 + an) + an-1an
//C风格求解改进版2,乘法分配律,通过率100%
#include <bits/stdc++.h>
const int N = 2e5 + 10;
int a[N];
int main(){
int n;long long sum = 0,ans = 0;
scanf("%d",&n);
for(int i = 0; i < n; i++){
scanf("%d",&a[i]);
sum += a[i];
}
for(int i = 0; i < n; i++){
sum -= a[i];
ans += a[i]*sum;
}
printf("%lld",ans);
return 0;
}
S = a1a2 +... + a1an + ... + an-1a1 + ... + an-2an-1+ an-2an + an-1an
= a1(a2+..+an) + ... + an-2(an-1 + an) + an-1an
= a1S2 + ... + an-2Sn-1 + an-1Sn
Si = ai + ... + an-1 + an
Si = Si+1 + ai
//C风格求解改进版3,和2差不多,后缀和,通过率100%
#include <bits/stdc++.h>
const int N = 2e5 + 10;
int a[N];long long S[N];
int main()
{
int n;long long sum = 0,ans = 0;
scanf("%d",&n);
for(int i = 1; i <= n; i++)
{
scanf("%d",&a[i]);
}
for(int i = n; i >= 1; i--){
S[i] = S[i + 1] + a[i];
}
for(int i = 1; i <= n; i++){
ans += a[i] * S[i + 1];
}
printf("%lld",ans);
return 0;
}
reference:
【C++】万能头文件 <bits/stdc++.h> 的用法和优缺点-CSDN博客
C基础——使用printf打印各种数据类型的方式(示例)_printf打印短整形-CSDN博客
跨平台(32bit和64bit)的 printf 格式符 %lld 输出64位的解决方式_printf lld-CSDN博客