ADDED SRM/643-U/1A.cpp Index: SRM/643-U/1A.cpp ================================================================== --- SRM/643-U/1A.cpp +++ SRM/643-U/1A.cpp @@ -0,0 +1,121 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +using namespace std; +typedef long long LL; +typedef complex CMP; + +class TheKingsFactorization { public: + vector getVector(long long N, vector primes) + { + vector ans; + for(int p=2; p<=1000001; ++p) + while(N%p == 0) { + ans.push_back(p); + N /= p; + } + + // all primes <= cbrt(N) is reported. we have at most 2 more. + + const LL last_p = primes.back(); + if(N%last_p==0 && N!=last_p) { + ans.push_back(min(N/last_p, last_p)); + ans.push_back(max(N/last_p, last_p)); + N = 1; + } + + if(N!=1) + ans.push_back(N); + + return ans; + } +}; + +// 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 vector& Expected, const vector& 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(_, TheKingsFactorization().getVector(N, primes));} +int main(){ + +CASE(0) + long long N = 12LL; + long long primes_[] = {2, 3}; + vector primes(primes_, primes_+sizeof(primes_)/sizeof(*primes_)); + long long __[] = {2, 2, 3 }; + vector _(__, __+sizeof(__)/sizeof(*__)); +END +CASE(1) + long long N = 7LL; + long long primes_[] = {7}; + vector primes(primes_, primes_+sizeof(primes_)/sizeof(*primes_)); + long long __[] = {7 }; + vector _(__, __+sizeof(__)/sizeof(*__)); +END +CASE(2) + long long N = 1764LL; + long long primes_[] = {2, 3, 7}; + vector primes(primes_, primes_+sizeof(primes_)/sizeof(*primes_)); + long long __[] = {2, 2, 3, 3, 7, 7 }; + vector _(__, __+sizeof(__)/sizeof(*__)); +END +CASE(3) + long long N = 49LL; + long long primes_[] = {7}; + vector primes(primes_, primes_+sizeof(primes_)/sizeof(*primes_)); + long long __[] = {7, 7 }; + vector _(__, __+sizeof(__)/sizeof(*__)); +END +CASE(4) + long long N = 210LL; + long long primes_[] = {2, 5}; + vector primes(primes_, primes_+sizeof(primes_)/sizeof(*primes_)); + long long __[] = {2, 3, 5, 7 }; + vector _(__, __+sizeof(__)/sizeof(*__)); +END +CASE(5) + long long N = 100000LL; + long long primes_[] = {2, 2, 2, 5, 5}; + vector primes(primes_, primes_+sizeof(primes_)/sizeof(*primes_)); + long long __[] = {2, 2, 2, 2, 2, 5, 5, 5, 5, 5 }; + vector _(__, __+sizeof(__)/sizeof(*__)); +END +CASE(6) + long long N = 540000003780LL; + long long primes_[] = {2,3,3,1000000007}; + vector primes(primes_, primes_+sizeof(primes_)/sizeof(*primes_)); + long long __[] = {2,2,3,3,3,5,1000000007}; + vector _(__, __+sizeof(__)/sizeof(*__)); +END +CASE(7) + long long N = 2700000018900LL; + long long primes_[] = {2,3,3,5}; + vector primes(primes_, primes_+sizeof(primes_)/sizeof(*primes_)); + long long __[] = {2,2,3,3,3,5,5,1000000007}; + vector _(__, __+sizeof(__)/sizeof(*__)); +END +} +// END CUT HERE ADDED SRM/643-U/1B-U.cpp Index: SRM/643-U/1B-U.cpp ================================================================== --- SRM/643-U/1B-U.cpp +++ SRM/643-U/1B-U.cpp @@ -0,0 +1,139 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +using namespace std; +typedef long long LL; +typedef complex CMP; + +enum {HH, HS, SH, SS}; + +class TheKingsArmyDiv1 { public: + int getNumber(vector state) + { + const int N = state[0].size(); + + vector s; + for(int i=0; i> blocks; + for(int i=0; i& b, int type) + { + int cost = 0; + for(int i=0; i +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(_, TheKingsArmyDiv1().getNumber(state));} +int main(){ + +CASE(0) + string state_[] = {"HSH", + "SHS"}; + vector state(state_, state_+sizeof(state_)/sizeof(*state_)); + int _ = 2; +END +CASE(1) + string state_[] = {"HH", + "HH"}; + vector state(state_, state_+sizeof(state_)/sizeof(*state_)); + int _ = 0; +END +CASE(2) + string state_[] = {"HHHHH", + "HSHSH"}; + vector state(state_, state_+sizeof(state_)/sizeof(*state_)); + int _ = 1; +END +CASE(3) + string state_[] = {"S", + "S"}; + vector state(state_, state_+sizeof(state_)/sizeof(*state_)); + int _ = -1; +END +CASE(4) + string state_[] = {"HSHHSHSHSHHHSHSHSH", + "SSSSHSSHSHSHHSSSSH"}; + vector state(state_, state_+sizeof(state_)/sizeof(*state_)); + int _ = 8; +END +CASE(5) + string state_[] = {"HS", + "HS"}; + vector state(state_, state_+sizeof(state_)/sizeof(*state_)); + int _ = 1; +END +CASE(6) +string state_[] = {"HHH", "SSS"}; + vector state(state_, state_+sizeof(state_)/sizeof(*state_)); + int _ = 1; +END +/* +CASE(7) + string state_[] = ; + vector state(state_, state_+sizeof(state_)/sizeof(*state_)); + int _ = ; +END +*/ +} +// END CUT HERE