#include <chrono>
#include <iostream>
#include <random>
#include <vector>
 
 
class stopwatch
{
  std::chrono::time_point<std::chrono::high_resolution_clock> last_;
public:
  stopwatch()
  {
    reset();
  }
  void reset()
  {
    last_ = std::chrono::high_resolution_clock::now();
  }
  std::chrono::microseconds elapsed() const
  {
    auto t = std::chrono::high_resolution_clock::now();
    return std::chrono::duration_cast<std::chrono::microseconds>(t - last_);
  }
  std::chrono::microseconds tick()
  {
    auto t = std::chrono::high_resolution_clock::now();
    auto elapsed = std::chrono::duration_cast<std::chrono::microseconds>(t - last_);
    last_ = t;
    return elapsed;
  }
}; 
 
template <std::size_t N, typename Iterator>
void foo(Iterator begin, Iterator end)
{
	for (; begin != end; ++begin)
	{
		*begin *= N;
		*begin *= N;
		*begin *= N;
		*begin *= N;
		*begin *= N;
	}
}
 
int main()
{
        std::vector<unsigned> v;
        std::default_random_engine e;
        
        for (unsigned i = 5000000; i-- != 0; )
                v.push_back(e());
 
        stopwatch w;
        foo<77>(v.begin(), v.end());
        std::cout << "Time: " << w.elapsed().count() / 1000000.0 << '\n';
        std::cout << v[e() % v.size()] << '\n';
 
        w.reset();
        foo<31>(v.begin(), v.end());
        std::cout << "Time: " << w.elapsed().count() / 1000000.0 << '\n';
        std::cout << v[e() % v.size()] << '\n';
}