Advertisement
Guest User

Untitled

a guest
Dec 18th, 2014
164
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.44 KB | None | 0 0
  1. #include <cmath>
  2. #include <cstdio>
  3. #include <array>
  4. #include <vector>
  5. #include <iostream>
  6. #include <fstream>
  7. #include <algorithm>
  8. #include <chrono>
  9.  
  10. constexpr auto cMOD = 1000000007U;
  11.  
  12. std::ifstream fileStream("in.txt");
  13. // std::istream& in = std::cin;
  14. std::istream& in = fileStream;
  15.  
  16. template <typename T>
  17. void read(T& array, const unsigned count) {
  18.     for (int i = 0; i != count; i++) {
  19.         unsigned n;
  20.         in >> n;
  21.         array[i] = n;
  22.     }
  23. }
  24.  
  25. const std::vector<unsigned long long> buildMultipliers(const unsigned count) {
  26.     std::array<unsigned, 100000> dividers;
  27.     std::array<unsigned, 100000> multipliers;
  28.     read(dividers, count);
  29.     read(multipliers, count);
  30.     std::vector<unsigned long long> aggregatedMultipliers(count, 1);
  31.     for (int i = 0; i != count; i++) {
  32.         // "-1" because of zero-based arrays
  33.         auto& cur = aggregatedMultipliers[dividers[i] - 1];
  34.  
  35.         const auto curMult = multipliers[i];
  36.         cur *= curMult;
  37.         cur %= cMOD;
  38.     }
  39.     return aggregatedMultipliers;
  40. }
  41.  
  42.  
  43. int main() {
  44.     unsigned elemCount;
  45.     unsigned opCount;
  46.     in >> elemCount >> opCount;
  47.  
  48.     std::array<unsigned long long, 100000> elems;
  49.     read(elems, elemCount);
  50.  
  51.     const auto multipliers = buildMultipliers(opCount);
  52.  
  53.     const auto beforeCalc = std::chrono::high_resolution_clock::now();
  54.     const auto test = elemCount;
  55.     for (auto mod = 1U; mod <= opCount; ++mod) {
  56.         // adjustment for zero-based arrays
  57.         const auto modIdx = mod - 1;
  58.  
  59.         const auto mult = multipliers[modIdx];
  60.         // (cur * mod): for each element that gets divided by mod
  61.         for (auto cur = 1;  (cur * mod) <= elemCount; ++cur) {
  62.             // adjust for zero based index
  63.             const auto idx = cur * mod - 1;
  64.             // std::cout << "cur=" << cur << "; mod=" << mod << "; cur * mod - 1=" << idx << std::endl;
  65.             // std::cout << "current elems[" << idx << "]=" << elems[idx] << std::endl;
  66.             elems[idx] *= mult;
  67.             elems[idx] %= cMOD;
  68.             // std::cout << "after mult with " << mult << ": " << elems[idx] << std::endl << std::endl;
  69.         }
  70.     }
  71.     const auto calcDur = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::high_resolution_clock::now() - beforeCalc);
  72.     // std::cout << "Calc took " << calcDur.count() << " ms." << std::endl;
  73.     std::cout << "1 " << elems[0] << std::endl;
  74.     std::ofstream outFile("out.txt");
  75.     // std::ostream& out = std::cout;
  76.     std::cout << "2 " << elems[0] << std::endl;
  77.     std::ostream& out = outFile;
  78.     for (auto i = 0U; i != elemCount; ++i) {
  79.         out << elems[i] << ' ';
  80.     }
  81.  
  82.     return 0;
  83. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement