ADDED SRM/537-U/1A.cpp Index: SRM/537-U/1A.cpp ================================================================== --- SRM/537-U/1A.cpp +++ SRM/537-U/1A.cpp @@ -0,0 +1,115 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef __GNUC__ +#include +#define unordered_map __gnu_cxx::hash_map +#else +#include +#endif +using namespace std; +typedef long long LL; +typedef complex CMP; + +class KingXNewCurrency { public: + int howMany(int A, int B, int X) + { + if(A%X==0 && B%X==0) + return -1; + int cnt = 0; + for(int Y=1; Y<=max(A,B); ++Y) + if( possible(A,B,X,Y) ) + cnt++; + return cnt; + } + + bool possible(int A, int B, int X, int Y) + { + bool Aok = false; + for(int p=0; p*X<=A; ++p) + if( (A-p*X)%Y == 0 ) + Aok = true; + bool Bok = false; + for(int p=0; p*X<=B; ++p) + if( (B-p*X)%Y == 0 ) + Bok = true; + return Aok&&Bok; + } +}; + +// BEGIN CUT HERE +#include +double start_time; string timer() + { ostringstream os; os << " (" << int((clock()-start_time)/CLOCKS_PER_SEC*1000) << " msec)"; return os.str(); } +template ostream& operator<<(ostream& os, const vector& v) + { os << "{ "; + for(typename vector::const_iterator it=v.begin(); it!=v.end(); ++it) + os << '\"' << *it << '\"' << (it+1==v.end() ? "" : ", "); os << " }"; return os; } +void verify_case(const int& Expected, const int& Received) { + bool ok = (Expected == Received); + if(ok) cerr << "PASSED" << timer() << endl; else { cerr << "FAILED" << timer() << endl; + cerr << "\to: \"" << Expected << '\"' << endl << "\tx: \"" << Received << '\"' << endl; } } +#define CASE(N) {cerr << "Test Case #" << N << "..." << flush; start_time=clock(); +#define END verify_case(_, KingXNewCurrency().howMany(A, B, X));} +int main(){ + +CASE(0) + int A = 5; + int B = 8; + int X = 5; + int _ = 5; +END +CASE(1) + int A = 8; + int B = 4; + int X = 2; + int _ = -1; +END +CASE(2) + int A = 7; + int B = 4; + int X = 13; + int _ = 1; +END +CASE(3) + int A = 47; + int B = 74; + int X = 44; + int _ = 2; +END +CASE(4) + int A = 128; + int B = 96; + int X = 3; + int _ = 65; +END +/* +CASE(5) + int A = ; + int B = ; + int X = ; + int _ = ; +END +CASE(6) + int A = ; + int B = ; + int X = ; + int _ = ; +END +*/ +} +// END CUT HERE ADDED SRM/537-U/1B.cpp Index: SRM/537-U/1B.cpp ================================================================== --- SRM/537-U/1B.cpp +++ SRM/537-U/1B.cpp @@ -0,0 +1,151 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef __GNUC__ +#include +#define unordered_map __gnu_cxx::hash_map +#else +#include +#endif +using namespace std; +typedef long long LL; +typedef complex CMP; + +class KingXMagicSpells { public: + double expectedNumber(vector ducks, vector spellOne, vector spellTwo, int K) + { + const int N = ducks.size(); + + vector revSpellTwo(N); + for(int i=0; i=0; --B) { + vector dd(N); + for(int i=0; i xx(N); + for(int i=0; i& dd, const vector & xx, const vector & moveBack, int K) + { + memo.clear(); + return prob(dd, xx, moveBack, K, 0, 1); + } + + map memo; + double prob( + const vector & dd, const vector & xx, const vector & moveBack, + int K, int room, int bit) { + if( K == 0 ) { + return dd[room]==bit ? 1.0 : 0.0; + } + + int key = (K * 100 + room) * 2 + bit; + if( memo.count(key) ) + return memo[key]; + double e = 0.5 * prob(dd,xx,moveBack,K-1,moveBack[room],bit) + + 0.5 * prob(dd,xx,moveBack,K-1,room,bit^xx[room]); + return memo[key] = e; + } +}; + +// BEGIN CUT HERE +#include +double start_time; string timer() + { ostringstream os; os << " (" << int((clock()-start_time)/CLOCKS_PER_SEC*1000) << " msec)"; return os.str(); } +template ostream& operator<<(ostream& os, const vector& v) + { os << "{ "; + for(typename vector::const_iterator it=v.begin(); it!=v.end(); ++it) + os << '\"' << *it << '\"' << (it+1==v.end() ? "" : ", "); os << " }"; return os; } +void verify_case(const double& Expected, const double& Received) { + bool ok = (abs(Expected - Received) < 1e-9); + if(ok) cerr << "PASSED" << timer() << endl; else { cerr << "FAILED" << timer() << endl; + cerr << "\to: \"" << Expected << '\"' << endl << "\tx: \"" << Received << '\"' << endl; } } +#define CASE(N) {cerr << "Test Case #" << N << "..." << flush; start_time=clock(); +#define END verify_case(_, KingXMagicSpells().expectedNumber(ducks, spellOne, spellTwo, K));} +int main(){ + +CASE(0) + int ducks_[] = {5, 3, 7}; + vector ducks(ducks_, ducks_+sizeof(ducks_)/sizeof(*ducks_)); + int spellOne_[] = {1, 7, 4}; + vector spellOne(spellOne_, spellOne_+sizeof(spellOne_)/sizeof(*spellOne_)); + int spellTwo_[] = {1, 0, 2}; + vector spellTwo(spellTwo_, spellTwo_+sizeof(spellTwo_)/sizeof(*spellTwo_)); + int K = 1; + double _ = 3.5; +END +CASE(1) + int ducks_[] = {5, 8}; + vector ducks(ducks_, ducks_+sizeof(ducks_)/sizeof(*ducks_)); + int spellOne_[] = {53, 7}; + vector spellOne(spellOne_, spellOne_+sizeof(spellOne_)/sizeof(*spellOne_)); + int spellTwo_[] = {1, 0}; + vector spellTwo(spellTwo_, spellTwo_+sizeof(spellTwo_)/sizeof(*spellTwo_)); + int K = 2; + double _ = 21.5; +END +CASE(2) + int ducks_[] = {123, 456, 789, 1234, 56789}; + vector ducks(ducks_, ducks_+sizeof(ducks_)/sizeof(*ducks_)); + int spellOne_[] = {0, 0, 0, 0, 0}; + vector spellOne(spellOne_, spellOne_+sizeof(spellOne_)/sizeof(*spellOne_)); + int spellTwo_[] = {0, 1, 2, 3, 4}; + vector spellTwo(spellTwo_, spellTwo_+sizeof(spellTwo_)/sizeof(*spellTwo_)); + int K = 50; + double _ = 123.0; +END +CASE(3) + int ducks_[] = {83291232, 3124231, 192412, 3813249, 629231, 9998989}; + vector ducks(ducks_, ducks_+sizeof(ducks_)/sizeof(*ducks_)); + int spellOne_[] = {58, 37, 44, 66, 72, 19}; + vector spellOne(spellOne_, spellOne_+sizeof(spellOne_)/sizeof(*spellOne_)); + int spellTwo_[] = {2, 0, 1, 5, 4, 3}; + vector spellTwo(spellTwo_, spellTwo_+sizeof(spellTwo_)/sizeof(*spellTwo_)); + int K = 11; + double _ = 2.888186784716797E7; +END +/* +CASE(4) + int ducks_[] = ; + vector ducks(ducks_, ducks_+sizeof(ducks_)/sizeof(*ducks_)); + int spellOne_[] = ; + vector spellOne(spellOne_, spellOne_+sizeof(spellOne_)/sizeof(*spellOne_)); + int spellTwo_[] = ; + vector spellTwo(spellTwo_, spellTwo_+sizeof(spellTwo_)/sizeof(*spellTwo_)); + int K = ; + double _ = ; +END +CASE(5) + int ducks_[] = ; + vector ducks(ducks_, ducks_+sizeof(ducks_)/sizeof(*ducks_)); + int spellOne_[] = ; + vector spellOne(spellOne_, spellOne_+sizeof(spellOne_)/sizeof(*spellOne_)); + int spellTwo_[] = ; + vector spellTwo(spellTwo_, spellTwo_+sizeof(spellTwo_)/sizeof(*spellTwo_)); + int K = ; + double _ = ; +END +*/ +} +// END CUT HERE