ADDED SRM/667-U/1A-U.cpp Index: SRM/667-U/1A-U.cpp ================================================================== --- SRM/667-U/1A-U.cpp +++ SRM/667-U/1A-U.cpp @@ -0,0 +1,150 @@ +#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; + +inline int bitcnt(int x) +{ + int c = 0; + for(; x; x>>=1) + c += x&1; + return c; +} + +class OrderOfOperations { public: + int minTime(vector s) + { + const int M = s[0].size(); + + vector edge; + int all = 0; + for(auto& si: s) { + int x = 0; + for(int i=0; i nbits; + for(int m=0; m<(1< Edge; + priority_queue, greater> Q; + Q.emplace(0, 0); + vector V(1< +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(_, OrderOfOperations().minTime(s));} +int main(){ + +CASE(0) + string s_[] = { + "111", + "001", + "010" +}; + vector s(s_, s_+sizeof(s_)/sizeof(*s_)); + int _ = 3; +END +CASE(1) + string s_[] = { + "11101", + "00111", + "10101", + "00000", + "11000" +}; + vector s(s_, s_+sizeof(s_)/sizeof(*s_)); + int _ = 9; +END +CASE(2) + string s_[] = { + "11111111111111111111" +}; + vector s(s_, s_+sizeof(s_)/sizeof(*s_)); + int _ = 400; +END +CASE(3) + string s_[] = { + "1000", + "1100", + "1110" +}; + vector s(s_, s_+sizeof(s_)/sizeof(*s_)); + int _ = 3; +END +CASE(4) + string s_[] = { + "111", + "111", + "110", + "100" +}; + vector s(s_, s_+sizeof(s_)/sizeof(*s_)); + int _ = 3; +END +CASE(5) + string s_[] = {"00100001010101000101","11011001110001000111","01011001010101111001","01011100110111000111","11000100001100001000","11110000101111111111","10010110010000000111","10001100001101110001","00010001100000010010","10001111001101101011","01010111000111100110","00111100010101100010","00110111000100111111","01100000110001000010","11011001011011101100","11111101100111101100","10011101010111101010","11001100000100011100","10111010000011100101","11001000000000011110","10110010101111110000","10101001011011100010","00101001111000110100","10011000010100011000","00011000001011110111","00111000101010001111","01011110110001111100","01010001100001010100","11001010000011000101","00000100010101101000","11100110101101011101","01110100101010100011","10100000100100010100","00111101010111101100","10101011110111111011","01001101010110000000","00111110001011010101","01011011010100011111","11011110011011111111","11111100000011110111","00110001010001100010","00100101011011100001","10101111001101011011","01011101100100010010","01000001010011101100","11001010100110001110","00010110001001110001","01000001111111110100","01001100101111101011","00010101001100110110"}; + vector s(s_, s_+sizeof(s_)/sizeof(*s_)); + int _ = -2; +END +CASE(6) + string s_[] = { + "1100", + "0011", + "0110", + }; + vector s(s_, s_+sizeof(s_)/sizeof(*s_)); + int _ = 6; +END +} +// END CUT HERE ADDED SRM/667-U/1B-U.cpp Index: SRM/667-U/1B-U.cpp ================================================================== --- SRM/667-U/1B-U.cpp +++ SRM/667-U/1B-U.cpp @@ -0,0 +1,141 @@ +#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 CatsOnTheCircle { public: + int N; + double p; + + double getProb(int N_, int K, int p_) + { + N = N_; + p = p_ / pow(10.0,9); + return rec(false, 1, K-1); + } +/* + void rec2(int V, + vector* p_t2e, + vector* q_t2e) { + if(V == N-1) { + p_t2e->assign(1, 1.0); + q_t2e->assign(1, 1.0); + return; + } + + vector pp, qq; + rec2(V+1, &pp, &qq); + + vector pp2; + pp2 += (pp<<1) * rightOut(p,V); + pp2 += rev(qq<<1) * (1-rightOut(p,V)); + } +*/ + double rec(bool inv, int V, int T) { + if(V == N-1) + return 1.0; + double pp = 0.0; + if(T!=0) pp += rightOut(inv?1-p:p,V) * rec(inv, V+1,T-1); + if(T!=N-V-1) pp += (1-rightOut(inv?1-p:p,V)) * rec(!inv, V+1,N-V-2-T); + return pp; + } + + double rightOut(const double p, int V) { + if(V==1) + return p; + //x = p + (1-p)y + //y = rightOut(V-1)x + return p / (1 - (1-p)*rightOut(p, V-1)); + } +}; + +// 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(_, CatsOnTheCircle().getProb(N, K, p));} +int main(){ + +CASE(0) + int N = 3; + int K = 1; + int p = 300000000; + double _ = 0.6999999999999985; +END +CASE(1) + int N = 6; + int K = 2; + int p = 500000000; + double _ = 0.2; +END +CASE(2) + int N = 6; + int K = 5; + int p = 500000000; + double _ = 0.2; +END +CASE(3) + int N = 10; + int K = 2; + int p = 666666666; + double _ = 0.00391389439551009; +END +CASE(4) + int N = 999999999; + int K = 999999996; + int p = 777777777; + double _ = 0.05830903870125612; +END +CASE(5) + int N = 1000000000; + int K = 4; + int p = 300000000; + double _ = 0.044981259448371; +END +CASE(6) + int N = 534428790; + int K = 459947197; + int p = 500000000; + double _ = 1.871156682766205E-9; +END +/* +CASE(7) + int N = ; + int K = ; + int p = ; + double _ = ; +END +CASE(8) + int N = ; + int K = ; + int p = ; + double _ = ; +END +*/ +} +// END CUT HERE