Tổng bằng 0

Xem PDF




Tác giả:
Dạng bài
Điểm: 200 (p) Thời gian: 1.0s Bộ nhớ: 1023M Input: bàn phím Output: màn hình

Bạn được cho một dãy số \(a\) gồm \(n\) số nguyên. Nhiệm vụ của bạn là tìm số cặp số \((i,j) \ 1 \leq i \leq j \leq n\) sao cho \(a_i + a_{i+1} + ... + a_j = 0\)

Input

  • Dòng đầu tiên chứa số nguyên dương \(n \ (1 \leq n \leq 10^5)\) - là số phần tử của mảng.
  • Dòng thứ hai chứa \(n\) số nguyên, số thứ \(i\)\(a_i\) \(( \mid a_i\mid \leq 10^9)\)

Output

  • Số lượng cặp số \((i,j)\) thõa mãn điều kiện trên

Example

Test 1

Input
4
-3 3 -4 4
Output
3

Bình luận


  • 0
    obamagaming    9:17 p.m. 12 Tháng 1, 2023
    Sì poi lơ át lét
    #include <bits/stdc++.h>
        using namespace std;
        #define ll long long  
    
        int main()
        {
            int n, cnt = 0, ans = 0; cin >> n; ll temp,t[n+1];
            t[0] = 0;
            map<ll,int> mp;
            for (int i=1; i<=n; i++) 
            {
                cin >> temp; 
                t[i]=t[i-1]+temp; 
                mp[t[i]]++;
            }
            for (auto i:mp)
            {
                if (i.first == 0) ans += (i.second*(i.second+1))/2;
                else ans += (i.second*(i.second-1))/2;
            }
            cout << ans;
        }
    

    • 0
      quan26052013    3:11 p.m. 30 Tháng 7, 2024
      C++
      #include <bits/stdc++.h>
          using namespace std;
          #define ll long long  
      
          int main()
          {
              int n, cnt = 0, ans = 0; cin >> n; ll temp,t[n+1];
              t[0] = 0;
              map<ll,int> mp;
              for (int i=1; i<=n; i++) 
              {
                  cin >> temp; 
                  t[i]=t[i-1]+temp; 
                  mp[t[i]]++;
              }
              for (auto i:mp)
              {
                  if (i.first == 0) ans += (i.second*(i.second+1))/2;
                  else ans += (i.second*(i.second-1))/2;
              }
              cout << ans;
          }
      
    2 bình luận nữa