Advertisement
shamiul93

1134 - Be Efficient

Dec 14th, 2017
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.74 KB | None | 0 0
  1. /**
  2. @author - Rumman BUET CSE'15
  3. Problem - 1134 - Be Efficient
  4. Idea - সব ভাগশেষ গুলার কিউমিলিটীভ সাম বের করো। যদি দেখো যে ওই সামের মধ্যে কোনটা ০, তার মানে ফার্স্ট ইন্ডেক্স
  5. থেকে এই পর্যন্ত সবার সাম আসলে M দ্বারা  ডিভিজিবল। আবার যদি দেখো যে যেকোন ২ টা ইন্ডেক্সের কিউম সাম সমান,
  6. তার মানে এই দুই ইন্ডেক্সের মধ্যে যারা ছিলো, তাদের সাম হয় শুণ্য, নাইলে M দ্বারা ডিভিজিবল
  7. তাইলে অ্যান্সার হইলো কি?
  8. ans = total number of '0's + n * (n-1) / 2 ;
  9. হিসাব করে দেখ, এরকম কম্বিনেশন n * (n-1) /2  ই হওয়া পসিবল ।
  10. */
  11.  
  12. // LightOJ always needs this format for sure..so I made a copy of it...
  13. #include <bits/stdc++.h>
  14. #include<vector>
  15. #define ll                                      long long int
  16. #define fi                                      freopen("in.txt", "r", stdin)
  17. #define fo                                      freopen("out.txt", "w", stdout)
  18. #define m0(a) memset(a , 0 , sizeof(a))
  19. #define m1(a) memset(a , -1 , sizeof(a))
  20. #define inf LLONG_MAX
  21. #define min3(a,b,c) min(a,min(b,c))
  22. #define max3(a,b,c) max(a,max(b,c))
  23.  
  24.  
  25. using namespace std;
  26.  
  27. ll N, M ;
  28. ll arr[100009] = {} ;
  29.  
  30. ll cumsum[100002] ;
  31. map<ll,ll> Map ;
  32.  
  33. int main()
  34. {
  35. //    fi;
  36. //    fo ;
  37.  
  38.     ll T, t = 0 ;
  39.     scanf("%lld",&T) ;
  40.  
  41.     while(T--)
  42.     {
  43.         t++ ;
  44.  
  45.         m0(cumsum) ;
  46.         scanf("%lld %lld",&N,&M) ;
  47.  
  48.         for(ll i = 0 ; i < N ; i++)
  49.         {
  50.             scanf("%lld",&arr[i]) ;
  51.         }
  52.  
  53.         ll ans = 0 ;
  54.         cumsum[0] = arr[0] % M ;
  55.         for(ll i = 0  ;i < N ; i++)
  56.         {
  57.             cumsum[i] = (cumsum[i-1] % M + arr[i] % M)%M ;
  58.  
  59.             if(cumsum[i] == 0)
  60.             {
  61.                 ans++ ;
  62.             }
  63.  
  64.             if(Map.find(cumsum[i]) == Map.end())
  65.             {
  66.                 Map[cumsum[i]] = 1 ;
  67.             }
  68.             else
  69.             {
  70.                 Map[cumsum[i]]++ ;
  71.             }
  72.         }
  73.  
  74.         map<ll , ll>:: iterator it ;
  75.  
  76.         for(it = Map.begin() ; it != Map.end() ; it++)
  77.         {
  78.             ll a , b ;
  79.             a = it -> first ;
  80.             b = it -> second ;
  81.  
  82.             ans += (b * (b-1) / 2) ;
  83.         }
  84.  
  85.  
  86.         printf("Case %lld: %lld\n", t , ans) ;
  87.         Map.clear();
  88.     }
  89.     return 0 ;
  90. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement