J 建设道路

题目描述

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

输入描述:

第一行一个整数 nnn,表示城市的数量。

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

输出描述:

输出一行一个数字,表示工程的花费模 1e9+71e9+71e9+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

备注:

1≤n≤5e51\leq n\leq 5e51≤n≤5e5
1≤ai≤1e91\leq a_i\leq 1e91≤ai​≤1e9
建议使用 scanf 读入

注意负数取模,这点被坑了。。

#include <iostream>
#include <cmath>
#include <cstring>
#include <queue>
#include <algorithm>
#include <map>
using namespace std;

typedef long long ll;
const int maxn = 5e5 + 10;
const int mod = 1e9 + 7;
int n;
ll a[maxn];
ll sum[maxn];

int main() {
	cin >> n;
	for(int i = 1; i <= n; i++)
		cin >> a[i];
	for(int i = n; i >= 1; i--) {
		sum[i] = sum[i + 1] + a[i];	
		sum[i] %= mod;
	}
	ll ans = 0;
	for(int i = 1; i <= n; i++) {
		ans += (a[i] * (n - 1) % mod ) * a[i] % mod;
		ans %= mod;
	
		ll tem = 2 * sum[i + 1] % mod * a[i] % mod;
		tem %= mod;
		ans -= tem;
		ans += mod;
		ans %= mod; //长记性了!一直wa,最后才发现是负数取模的问题
	}
	cout << ans;
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值