2080 蓝桥杯 求和 困难

蓝桥杯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语言常量定义_c语言定义常量-CSDN博客

多项式的平方公式_百度知道 (baidu.com)

数据类型的取值范围c - CSDN文库​​​​​​

C基础——使用printf打印各种数据类型的方式(示例)_printf打印短整形-CSDN博客

跨平台(32bit和64bit)的 printf 格式符 %lld 输出64位的解决方式_printf lld-CSDN博客

乘法分配律_百度百科

前缀和,积,后缀和,积-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值