#include using namespace std; #define all(x) begin(x), end(x) #define sz(x) (ll)(x).size() using ll = long long; using ld = long double; mt19937 rng(123456789); const string chars = "MDCLCVI"; vector block1 = {"MMM"}; vector block2 = {"CCC"}; vector block3 = {"XXX"}; vector block4 = {"III"}; int main(int argc, char** argv) { for (int i = 1; i < argc; i++) { if (string(argv[i]) == "--CM") block2.push_back("CM"); if (string(argv[i]) == "--XC") block3.push_back("XC"); if (string(argv[i]) == "--IX") block4.push_back("IX"); if (string(argv[i]) == "--seed" && i+1 < argc) rng.seed(stoll(argv[i+1])); } vector> res; for (string a : block1) { for (string b : block2) { for (string c : block3) { for (string d : block4) { res.push_back({a+b+c+d, uniform_int_distribution(0, 1'000'000'000'000'000)(rng)}); } } } } vector output(sz(chars)); for (auto e : res) { for (ll i = 0; i < sz(chars); i++) { output[i] += count(all(e.first), chars[i]) * e.second; } } //some noise... for (ll i = 0; i < sz(chars); i++) { output[i] += uniform_int_distribution(0, 1'000'000)(rng); } for (ll i = 0; i < sz(chars); i++) { cout << output[i]; if (i + 1 < sz(chars)) cout << " "; assert(output[i] <= 1'000'000'000'000'000'000); assert(output[i] >= 0); } cout << endl; }