Advertisement
dmkozyrev

l.cpp

May 10th, 2018
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.04 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. typedef int64_t Int;
  4.  
  5. const Int mod = (Int)1e9+7;
  6.  
  7. // Sum of arithmetic progression: 1 + 2 + ... + last = last * (last+1) / 2
  8. Int sum(Int last) {
  9.     return last * (last+1) % mod * ((mod+1) / 2) % mod;
  10. }
  11.  
  12. // Calculate sum of walks between each pair of vertices in caterpillar tree:
  13. Int solve(const std::vector<Int> & d) {
  14.     Int answer = 0, n = (Int)d.size();
  15.    
  16.     // Calculate sum of walks between each pair of main vertices:
  17.     for (Int last = n-1; last > 0; --last) {
  18.         answer = (answer + sum(last)) % mod;
  19.     }
  20.    
  21.     // Calculate sum of walks between each pair from main and additional vertices:
  22.     for (Int i = 0; i < n; ++i) {
  23.         answer = (answer + sum(i+1) * d[i] % mod) % mod;
  24.         answer = (answer + sum(n-i) * d[i] % mod) % mod;
  25.     }
  26.     answer = (answer + mod - std::accumulate(d.begin(), d.end(), Int(0))) % mod; // substract repetitive walks
  27.    
  28.     // Calculate sum of walks between each pair of additional vertices in one group:
  29.     for (Int i = 0; i < n; ++i) {
  30.         answer = (answer + d[i] * (d[i]-1) % mod) % mod;
  31.     }
  32.    
  33.     // Calculate suffix sums over vector d:
  34.     // suffix1[i] = d[i] + d[i+1] + d[i+2] + ... + d[n-1]
  35.     // suffix2[i] = (i+1) * d[i] + (i+2) * d[i+1] + (i+3) * d[i+2] + ... + n * d[n-1]
  36.     std::vector<Int> suffix1(n+1, 0), suffix2(n+1, 0);
  37.     for (Int i = n-1; i >= 0; --i) {
  38.         suffix1[i] = (suffix1[i+1] + d[i]) % mod;
  39.         suffix2[i] = (suffix2[i+1] + d[i] * (i+1)) % mod;
  40.     }
  41.    
  42.     // Calculate walks between each pair of vertices from different groups:
  43.     for (Int i = 0; i < n; ++i) {
  44.         Int mul = (suffix2[i+1] + (mod + 1 - i) * suffix1[i+1] % mod) % mod;
  45.         answer = (answer + d[i] * mul % mod) % mod;
  46.     }
  47.    
  48.     return answer;
  49. }
  50.  
  51. int main() {    
  52.     std::ios_base::sync_with_stdio(false); std::cin.tie(0); std::cout.tie(0);
  53.    
  54.     Int n; std::cin >> n;
  55.    
  56.     std::vector<Int> d(n); for (auto& it : d) std::cin >> it;
  57.    
  58.     std::cout << solve(d) << std::endl;
  59.    
  60.     return 0;
  61. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement