結果
問題 | No.2 素因数ゲーム |
ユーザー | ブルーレヰ |
提出日時 | 2021-02-25 15:32:34 |
言語 | C++17 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 3 ms / 5,000 ms |
コード長 | 8,820 bytes |
コンパイル時間 | 2,036 ms |
コンパイル使用メモリ | 110,424 KB |
実行使用メモリ | 5,248 KB |
最終ジャッジ日時 | 2024-10-01 06:23:12 |
合計ジャッジ時間 | 2,678 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
5,248 KB |
testcase_01 | AC | 2 ms
5,248 KB |
testcase_02 | AC | 2 ms
5,248 KB |
testcase_03 | AC | 2 ms
5,248 KB |
testcase_04 | AC | 1 ms
5,248 KB |
testcase_05 | AC | 1 ms
5,248 KB |
testcase_06 | AC | 2 ms
5,248 KB |
testcase_07 | AC | 2 ms
5,248 KB |
testcase_08 | AC | 2 ms
5,248 KB |
testcase_09 | AC | 2 ms
5,248 KB |
testcase_10 | AC | 2 ms
5,248 KB |
testcase_11 | AC | 2 ms
5,248 KB |
testcase_12 | AC | 2 ms
5,248 KB |
testcase_13 | AC | 2 ms
5,248 KB |
testcase_14 | AC | 2 ms
5,248 KB |
testcase_15 | AC | 2 ms
5,248 KB |
testcase_16 | AC | 2 ms
5,248 KB |
testcase_17 | AC | 2 ms
5,248 KB |
testcase_18 | AC | 2 ms
5,248 KB |
testcase_19 | AC | 2 ms
5,248 KB |
testcase_20 | AC | 2 ms
5,248 KB |
testcase_21 | AC | 3 ms
5,248 KB |
testcase_22 | AC | 2 ms
5,248 KB |
testcase_23 | AC | 2 ms
5,248 KB |
testcase_24 | AC | 2 ms
5,248 KB |
testcase_25 | AC | 2 ms
5,248 KB |
testcase_26 | AC | 2 ms
5,248 KB |
testcase_27 | AC | 2 ms
5,248 KB |
testcase_28 | AC | 2 ms
5,248 KB |
testcase_29 | AC | 2 ms
5,248 KB |
testcase_30 | AC | 2 ms
5,248 KB |
ソースコード
/* Converted from Scratch by scratch2cpp (https://github.com/yos1up/scratch2cpp). */ #include <iostream> #include <stdlib.h> #include <string> #include <vector> #include <algorithm> #include <math.h> #define debug cerr << "--" << __LINE__ << "--" << "\n" typedef long long ll; using namespace std; class Var{ // NOTE: immutable public: mutable string sval; mutable long double dval; enum NumericState {UNKNOWN = -1, STRINGY = 0, NUMERIC = 1}; mutable NumericState numericState; mutable bool svalValid, dvalValid; // TODO: initialize at here? Var(){ *this = Var(""); } Var(string s){ sval = s; svalValid = true; dvalValid = false; numericState = UNKNOWN; } Var(long double d){ dval = d; svalValid = false; dvalValid = true; numericState = NUMERIC; } Var(const Var &v){ sval = string(v.sval); dval = v.dval; svalValid = v.svalValid; dvalValid = v.dvalValid; numericState = v.numericState; } void fillDval() const{ if (dvalValid) return; long double d; bool numeric = isNumericString(sval, &d); if (numeric){ numericState = NUMERIC; dval = d; }else{ numericState = STRINGY; dval = 0.0; } dvalValid = true; } static bool isNumericString(const string &s, long double *ptr) { char* ep; // cause side-effect: errno can be ERANGE after calling strtod *ptr = strtold(s.c_str(), &ep); // Scratch 3.0 recognize the string cause underflows or overflows as Numeric return NULL != ep && '\0' == ep[0] && s[0] != '\0'; } bool isNumeric() const{ fillDval(); return numericState == NUMERIC; } void fillSval() const{ if (svalValid) return; sval = (floorl(dval) == dval) ? to_string((ll)dval) : to_string(dval); svalValid = true; } long double asNumber() const{ fillDval(); return dval; } string asString() const{ fillSval(); return sval; } Var operator+(const Var &y) const{ return Var(this->asNumber() + y.asNumber()); } Var operator+=(const Var &y){ *this = *this + y; return *this; } Var operator-(const Var &y) const{ return Var(this->asNumber() - y.asNumber()); } Var operator*(const Var &y) const{ return Var(this->asNumber() * y.asNumber()); } Var operator/(const Var &y) const{ return Var(this->asNumber() / y.asNumber()); } Var operator%(const Var &y) const{ return Var(fmodl(this->asNumber(), y.asNumber())); } bool operator<(const Var &y) const{ if (this->isNumeric() && y.isNumeric()){ return this->asNumber() < y.asNumber(); } // compare as number if both can be interpreted as numeric return this->asString() < y.asString(); } bool operator>(const Var &y) const{ return y < *this; } bool operator==(const Var &y) const{ if (this->isNumeric() && y.isNumeric()){ return this->asNumber() == y.asNumber(); } // compare as numeric if both are numeric return this->asString() == y.asString(); } friend ostream& operator << (ostream& os, const Var& p); friend istream& operator >> (istream& is, const Var& p); }; ostream& operator << (ostream& os, const Var& p){ os << p.asString(); return os; } istream& operator >> (istream& is, Var& p){ string s; is >> s; p = Var(s); return is; } Var letterOf(Var index, Var sourceString){ /* index: 1-origined */ string str = sourceString.asString(); int idx = (int)(index.asNumber() - 1); // seem to be dirty but Scratch seems to do like this. // ex. letterOf(0.01, "world") == "w", letterOf(1.99, "world") == "w", letterOf(5.99, "world") == "d" if (0 <= idx && idx < str.size()) return Var(str.substr(idx, 1)); return Var(); } class VarList{ public: vector<Var> data; VarList(const vector<Var> &x) { data = x; } void push_back(const Var &x){ data.push_back(x); } void pop_back(){ data.pop_back(); } void clear(){ data.clear(); } int size(){ return (int) data.size(); } Var getLineOfList(const Var &index) const{ /* index: 1-origined */ int idx = (int)index.asNumber() - 1; // (unlike 'letterOf', index==0.9 does not work.) if (0 <= idx && idx < data.size()) return data[idx]; return Var(); } void setLineOfListTo(const Var &index, const Var &v){ /* index: 1-origined */ int idx = (int)index.asNumber() - 1; if (0 <= idx && idx < data.size()) data[idx] = v; } void deleteLineOfList(const Var &index){ /* index: 1-origined */ string kwd = index.asString(); if (kwd == "all"){ data.clear(); }else if (kwd == "last"){ data.pop_back(); }else{ int idx = (int)index.asNumber() - 1; if (0 <= idx && idx < data.size()) data.erase(data.begin() + idx); } } void insertAtIndexOfList(const Var &item, const Var &index){ /* index: 1-origined */ int idx = (int)index.asNumber() - 1; if (0 <= idx && idx <= data.size()) data.insert(data.begin() + idx, item); } void insertAtRandomOfList(const Var &item){ int idx = rand() % (data.size() + 1); data.insert(data.begin() + idx, item); } string asString() const{ /* concatenate elements of list with space */ // TODO: concatenated without spaces only if all elements are single characters. // (Is it an official bug? (or feature?)) string ret; for(int i=0;i<data.size();i++){ if (i > 0) ret += ' '; ret += data[i].asString(); } return ret; } int itemNumOfList(const Var &item) const{ auto itr = find(data.begin(), data.end(), item); if (itr == data.end()) return 0; return 1 + (int)(itr - data.begin()); /* index: 1-origined */ } friend ostream& operator << (ostream& os, const VarList& p); }; ostream& operator << (ostream& os, const VarList& p){ os << p.asString(); return os; } long double randUniform(const long double x, const long double y){ if (x > y) return randUniform(y, x); if (floor(x) == x && floor(y) == y){ ll xi = (ll)round(x), yi = (ll)round(y); return xi + rand() % (yi - xi + 1); }else{ return x + (y - x) * (0.0 + rand()) / RAND_MAX; } } Var buf_answer; // for "answer" // ============================= Scripts ============================= // variable declaration Var var_i(4); Var var_temp(1); Var var_j(2); Var var_result(0); Var var__7dcf_5bfe_79f0_5dee(0); Var var__52dd_8005("Bob"); // list declaration VarList list__7d20_56e0_6570_5206_89e3({Var(3), Var(1), Var(2)}); // prototype declaration of functions int func__0025s(const Var &arg_n); int main(); int func_XOR(const Var &arg_lhs, const Var &arg_rhs); // contents of functions int func__0025s(const Var &arg_n){ list__7d20_56e0_6570_5206_89e3.clear(); var_temp = arg_n; var_i = Var(2); while (!((var_i * var_i) > arg_n)){ if (((var_temp % var_i) == Var(0))){ var_j = Var(0); while (!(!((var_temp % var_i) == Var(0)))){ var_temp = (var_temp / var_i); var_j += Var(1); } list__7d20_56e0_6570_5206_89e3.push_back(var_j); } var_i += Var(1); } if ((!(var_temp == Var(1)))){ list__7d20_56e0_6570_5206_89e3.push_back(Var(1)); } return 0; } int main(){ cin >> buf_answer; func__0025s(buf_answer); var__7dcf_5bfe_79f0_5dee = Var(0); var_i = Var(1); for (int cnt_0=0;cnt_0<Var(list__7d20_56e0_6570_5206_89e3.size()).asNumber();cnt_0++){ func_XOR(var__7dcf_5bfe_79f0_5dee, list__7d20_56e0_6570_5206_89e3.getLineOfList(var_i)); var__7dcf_5bfe_79f0_5dee = var_result; var_i += Var(1); } if ((var__7dcf_5bfe_79f0_5dee == Var(0))){ var__52dd_8005 = Var("Bob"); } else { var__52dd_8005 = Var("Alice"); } cout << var__52dd_8005 << endl; return 0; } int func_XOR(const Var &arg_lhs, const Var &arg_rhs){ if (((arg_lhs == Var(0)) && (arg_rhs == Var(0)))){ var_result = Var(0); } else { func_XOR(Var(floor((arg_lhs / Var(2)).asNumber())), Var(floor((arg_rhs / Var(2)).asNumber()))); var_result = (var_result * Var(2)); var_result += (!((arg_lhs % Var(2)) == (arg_rhs % Var(2)))); } return 0; }