牛客小白月賽24 J—建設道路

整理的算法模板:ACM算法模板總結(分類詳細版)

鏈接:https://ac.nowcoder.com/acm/contest/5158/J
來源:牛客網
 

時間限制:C/C++ 1秒,其他語言2秒
空間限制:C/C++ 262144K,其他語言524288K
64bit IO Format: %lld

題目描述

牛牛國有 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

3
1 2 3

輸出

複製6

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 讀入

 

補這道題的博客原因是貌似學到了一個新知識:

對於一個序列或者數組中的任意兩個數做求和,然後求出來總和是多少;如果用二重循環,數據多一點就會超時;根據這道題發現一個規律;

\sum_{i=1}^{n}\sum_{j=i+1}^{n}(Ai+Aj)   =  (n-1)  *    \sum_{i=1}^{n}(Ai)

對於這道題,小哥哥們推的很詳細;我就不闡述了;下面圖面的題解是把 j 從 1 枚舉到   i-1  這和 j 從 i+1 枚舉到 n 的原理是一樣的;(實在不行搞個簡單的自己模擬一下就推出來了,eg:求1 2 3 4 5 的任意兩個數和的總和)

需要注意的是一定要處處取模,數據太大,隨時會爆int;

 

 

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=5e5,mod=1e9+7;
ll sum[N],a[N];
int main()
{
    int n;
    cin >>n;
    ll res=0,ans=0;
    for(int i=1;i<=n;i++)
    {
        scanf("%lld",&a[i]);
        res=(res+a[i]*a[i])%mod;
        sum[i]+=(a[i]+sum[i-1])%mod;
    }
    ans+=res%mod*(n-1)%mod;
    ll cnt=0;
    for(int i=1;i<=n;i++)
    {
        cnt+=2*a[i]*(sum[n]-sum[i])%mod;
    }
    printf("%lld\n",(ans-cnt+mod)%mod);
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章