#include <iostream>
#include <chrono>
#include <ratio>
#include <vector>
#include <numeric>
template <class Rep, class Period = std::ratio<1> >
using tmp_t = std::chrono::duration<Rep, Period>;
typedef tmp_t<int64_t> dollar_t;
typedef tmp_t<int64_t, std::ratio<1,100>> cent_t;
typedef tmp_t<int64_t, std::ratio<1,100>> store_money_t;
typedef tmp_t<double> show_money_t;
dollar_t dollar_lost_cents_cast(cent_t cents) { return std::chrono::duration_cast<dollar_t>(cents); }
std::ostream& operator<<(std::ostream& os, show_money_t show_money) { os << "$" << show_money.count(); return os; }
std::ostream& operator<<(std::ostream& os, store_money_t store_money) { os << store_money.count(); return os; }
int main() {
// example
store_money_t store_money = dollar_t(2) + cent_t(20);
store_money += dollar_t(7);
store_money += cent_t(18);
cent_t cents = store_money;
dollar_t dollars = dollar_lost_cents_cast(cents);
show_money_t show_money = cents;
std::cout << "dollar_lost_cents_cast = " << dollar_lost_cents_cast(store_money).count() <<
", store_money = " << store_money <<
", show_money = " << show_money <<
std::endl;
std::vector<store_money_t> user_accounts(1000, store_money);
store_money_t total = std::accumulate (user_accounts.begin(), user_accounts.end(), store_money_t(0));
std::cout << "total = " << show_money_t(total);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y2hyb25vPgojaW5jbHVkZSA8cmF0aW8+CiNpbmNsdWRlIDx2ZWN0b3I+CiNpbmNsdWRlIDxudW1lcmljPgoKdGVtcGxhdGUgPGNsYXNzIFJlcCwgY2xhc3MgUGVyaW9kID0gc3RkOjpyYXRpbzwxPiA+CnVzaW5nIHRtcF90ID0gc3RkOjpjaHJvbm86OmR1cmF0aW9uPFJlcCwgUGVyaW9kPjsKCnR5cGVkZWYgdG1wX3Q8aW50NjRfdD4gZG9sbGFyX3Q7CnR5cGVkZWYgdG1wX3Q8aW50NjRfdCwgc3RkOjpyYXRpbzwxLDEwMD4+IGNlbnRfdDsKCnR5cGVkZWYgdG1wX3Q8aW50NjRfdCwgc3RkOjpyYXRpbzwxLDEwMD4+IHN0b3JlX21vbmV5X3Q7CnR5cGVkZWYgdG1wX3Q8ZG91YmxlPiBzaG93X21vbmV5X3Q7CmRvbGxhcl90IGRvbGxhcl9sb3N0X2NlbnRzX2Nhc3QoY2VudF90IGNlbnRzKSB7IHJldHVybiBzdGQ6OmNocm9ubzo6ZHVyYXRpb25fY2FzdDxkb2xsYXJfdD4oY2VudHMpOyB9CnN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBzaG93X21vbmV5X3Qgc2hvd19tb25leSkgeyBvcyA8PCAiJCIgPDwgc2hvd19tb25leS5jb3VudCgpOyByZXR1cm4gb3M7IH0Kc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIHN0b3JlX21vbmV5X3Qgc3RvcmVfbW9uZXkpIHsgb3MgPDwgc3RvcmVfbW9uZXkuY291bnQoKTsgcmV0dXJuIG9zOyB9CgppbnQgbWFpbigpIHsKCgkvLyBleGFtcGxlCglzdG9yZV9tb25leV90IHN0b3JlX21vbmV5ID0gZG9sbGFyX3QoMikgKyBjZW50X3QoMjApOwoJc3RvcmVfbW9uZXkgKz0gZG9sbGFyX3QoNyk7CglzdG9yZV9tb25leSArPSBjZW50X3QoMTgpOwoJCgljZW50X3QgY2VudHMgPSBzdG9yZV9tb25leTsKCWRvbGxhcl90IGRvbGxhcnMgPSBkb2xsYXJfbG9zdF9jZW50c19jYXN0KGNlbnRzKTsKCXNob3dfbW9uZXlfdCBzaG93X21vbmV5ID0gY2VudHM7CgkKCXN0ZDo6Y291dCA8PCAiZG9sbGFyX2xvc3RfY2VudHNfY2FzdCA9ICIgPDwgZG9sbGFyX2xvc3RfY2VudHNfY2FzdChzdG9yZV9tb25leSkuY291bnQoKSA8PCAKCQkiLCBzdG9yZV9tb25leSA9ICIgPDwgc3RvcmVfbW9uZXkgPDwgCQkKCQkiLCBzaG93X21vbmV5ID0gIiA8PCBzaG93X21vbmV5IDw8IAoJCXN0ZDo6ZW5kbDsKCglzdGQ6OnZlY3RvcjxzdG9yZV9tb25leV90PiB1c2VyX2FjY291bnRzKDEwMDAsIHN0b3JlX21vbmV5KTsKCXN0b3JlX21vbmV5X3QgdG90YWwgPSBzdGQ6OmFjY3VtdWxhdGUgKHVzZXJfYWNjb3VudHMuYmVnaW4oKSwgdXNlcl9hY2NvdW50cy5lbmQoKSwgc3RvcmVfbW9uZXlfdCgwKSk7CglzdGQ6OmNvdXQgPDwgInRvdGFsID0gIiA8PCBzaG93X21vbmV5X3QodG90YWwpOwoKCXJldHVybiAwOwp9