建设道路 (思维题,想通了巨简单)

题目在这里

题目描述

牛牛国有 n个城市,编号为 1-n,第 i个城市有一个价值 ai,牛国的国王牛阔落特别喜欢在牛牛国旅游,并且他不想每次旅游的时候都计算一遍走哪条路最短,于是他决定在任意两个城市之间建立一条双向道路,在第 ii 座城市和第 jj 座城市之间建立双向道路的代价是 (ai-aj)*(ai−aj) ,牛阔落希望你能算出这项工程的花费。由于答案太大,你只需要输出答案模 1e9+7 的余数

输入描述:
第一行一个整数 nn,表示城市的数量。

第二行 nn 以空格分隔的整数 a1,a2,…,ana1,a2,…,an,表示第i座城市的价值。

输出描述:
输出一行一个数字,表示工程的花费模 1e9+7 的余数

示例1
输入

3
1 2 3

输出

6

说明
城市1到城市2的道路价值是(2 - 1)^ 2 = 1

城市2到城市3的道路价值是(3 - 2)^ 2 = 1

城市1到城市3的道路价值是(3 - 1)^ 2 = 4
总的花费 = 1 + 1 + 4 = 6

思路:
(a[i] - a[x]) * (a[i] - a[x]) = a[i] * a[i] - 2 * a[i]* a[x] + a[x] * a[x]
所以里面一共就有(n - 1)个a[i]的平方,中间这部分减法就是2 * (sum - a[i]) * a[i], sum即是所有数字的和。然后举个简单例子就能发现最后的答案为n倍的平方和-和的平方
a b c
(a-b)(a-b)+(a-c)(a-c)+(b-c)(b-c)
2aa+2bb+2cc-(ab+ac)-(ab+bc)-(ac+bc)
=2aa+2bb+2cc-(sum-a)a-(sum-b)b-(sum-c)c
=2aa+2bb+2cc-(a+b+c)sum+aa+bb+cc
=3(aa+bb+cc)-sumsum
同时注意
保证取模后的结果为正数:
((x % MOD) + MOD) % MOD

AC代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=1e6+100;
const int mod=1e9+7;
ll ans=0,sum=0,x;
int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>x;
        ans=(ans+x*x)%mod;
        sum=(sum+x)%mod;
    }
    ll res=(n*ans%mod-sum*sum%mod+mod)%mod;
    cout<<res<<endl;
    system("pause");
    return 0;
    

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值