ADDED SRM/498-U/1A.cpp Index: SRM/498-U/1A.cpp ================================================================== --- SRM/498-U/1A.cpp +++ SRM/498-U/1A.cpp @@ -0,0 +1,126 @@ +#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 FoxSequence { public: + string isValid(vector seq) + { + for(int b=2; b& seq, const int b, const int c ) + { + for(int i=b; i<=c; ++i) + if( seq[i] != seq[b] ) + return false; + return isUpDown(seq, 0, b) && isUpDown(seq, c, seq.size()-1); + } + + bool isUpDown( const vector& seq, const int L, const int R ) + { + int i = max_element(seq.begin()+L, seq.begin()+R+1) - seq.begin(); + if( Lseq[L] && isArith(seq, L, i, seq[L+1]-seq[L]) + && seq[R-1]>seq[R] && isArith(seq, i, R, seq[i+1]-seq[i]) ) + return true; + } + return false; + } + + bool isArith( const vector& seq, const int L, const int R, int d ) + { + for(int i=L; i+1<=R; ++i) + if( seq[i+1]-seq[i] != d ) + return false; + return true; + } +}; + +// 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 string& Expected, const string& 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(_, FoxSequence().isValid(seq));} +int main(){ + +CASE(0) + int seq_[] = {1,3,5,7,5,3,1,1,1,3,5,7,5,3,1} +; + vector seq(seq_, seq_+sizeof(seq_)/sizeof(*seq_)); + string _ = "YES"; +END +CASE(1) + int seq_[] = {1,2,3,4,5,4,3,2,2,2,3,4,5,6,4} +; + vector seq(seq_, seq_+sizeof(seq_)/sizeof(*seq_)); + string _ = "YES"; +END +CASE(2) + int seq_[] = {3,6,9,1,9,5,1} +; + vector seq(seq_, seq_+sizeof(seq_)/sizeof(*seq_)); + string _ = "YES"; +END +CASE(3) + int seq_[] = {1,2,3,2,1,2,3,2,1,2,3,2,1} +; + vector seq(seq_, seq_+sizeof(seq_)/sizeof(*seq_)); + string _ = "NO"; +END +CASE(4) + int seq_[] = {1,3,4,3,1,1,1,1,3,4,3,1} +; + vector seq(seq_, seq_+sizeof(seq_)/sizeof(*seq_)); + string _ = "NO"; +END +CASE(5) + int seq_[] = {6,1,6} +; + vector seq(seq_, seq_+sizeof(seq_)/sizeof(*seq_)); + string _ = "NO"; +END +/* +CASE(6) + int seq_[] = ; + vector seq(seq_, seq_+sizeof(seq_)/sizeof(*seq_)); + string _ = ; +END +CASE(7) + int seq_[] = ; + vector seq(seq_, seq_+sizeof(seq_)/sizeof(*seq_)); + string _ = ; +END +*/ +} +// END CUT HERE ADDED SRM/498-U/1B.cpp Index: SRM/498-U/1B.cpp ================================================================== --- SRM/498-U/1B.cpp +++ SRM/498-U/1B.cpp @@ -0,0 +1,149 @@ +#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; + +static const int MODVAL = 1000000009; // op/ depends on primarity of the MODVAL +struct mint +{ + int val; + mint():val(0){} + mint(int x):val(x%MODVAL) {} + mint(LL x):val(x%MODVAL) {} +}; + +mint operator+(mint x, mint y) { return x.val+y.val; } +mint operator-(mint x, mint y) { return x.val-y.val+MODVAL; } +mint operator*(mint x, mint y) { return LL(x.val)*y.val; } +mint POW(mint x, int e) { + mint v = 1; + for(;e;x=x*x,e>>=1) + if(e&1) + v=v*x; + return v; +} +mint operator/(mint x, mint y) { return x * POW(y, MODVAL-2); } + +vector FAC_(1,1); +void FAC_INIT(int n) { for(int i=1; i<=n; ++i) FAC_.push_back( FAC_.back()*i ); } +mint FAC(mint x) { return FAC_[x.val]; } +mint C(mint n, mint k) { return k.val<0 || n.val sx, vector sy) + { + if(FAC_.size()==1) + FAC_INIT(200*200+1); + + map,int> dd; + for(int y=0; y dis; + for(int i=0; i,int>::iterator it=dd.begin(); it!=dd.end(); ++it) + { + int n = it->second; + ans = ans * FAC(n); + } + return ans.val; + } +}; + +// 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(_, FoxStones().getCount(N, M, sx, sy));} +int main(){ + +CASE(0) + int N = 6; + int M = 1; + int sx_[] = {3}; + vector sx(sx_, sx_+sizeof(sx_)/sizeof(*sx_)); + int sy_[] = {1}; + vector sy(sy_, sy_+sizeof(sy_)/sizeof(*sy_)); + int _ = 4; +END +CASE(1) + int N = 2; + int M = 2; + int sx_[] = {2}; + vector sx(sx_, sx_+sizeof(sx_)/sizeof(*sx_)); + int sy_[] = {1}; + vector sy(sy_, sy_+sizeof(sy_)/sizeof(*sy_)); + int _ = 6; +END +CASE(2) + int N = 3; + int M = 3; + int sx_[] = {1,2,3}; + vector sx(sx_, sx_+sizeof(sx_)/sizeof(*sx_)); + int sy_[] = {1,2,3}; + vector sy(sy_, sy_+sizeof(sy_)/sizeof(*sy_)); + int _ = 8; +END +CASE(3) + int N = 12; + int M = 34; + int sx_[] = {5,6,7,8,9,10}; + vector sx(sx_, sx_+sizeof(sx_)/sizeof(*sx_)); + int sy_[] = {11,12,13,14,15,16}; + vector sy(sy_, sy_+sizeof(sy_)/sizeof(*sy_)); + int _ = 410850247; +END +/* +CASE(4) + int N = ; + int M = ; + int sx_[] = ; + vector sx(sx_, sx_+sizeof(sx_)/sizeof(*sx_)); + int sy_[] = ; + vector sy(sy_, sy_+sizeof(sy_)/sizeof(*sy_)); + int _ = ; +END +CASE(5) + int N = ; + int M = ; + int sx_[] = ; + vector sx(sx_, sx_+sizeof(sx_)/sizeof(*sx_)); + int sy_[] = ; + vector sy(sy_, sy_+sizeof(sy_)/sizeof(*sy_)); + int _ = ; +END +*/ +} +// END CUT HERE ADDED SRM/498-U/2C.cpp Index: SRM/498-U/2C.cpp ================================================================== --- SRM/498-U/2C.cpp +++ SRM/498-U/2C.cpp @@ -0,0 +1,82 @@ +#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 NinePuzzle { public: + int getMinimumCost(string init, string goal) + { + multiset s; + 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(_, NinePuzzle().getMinimumCost(init, goal));} +int main(){ + +CASE(0) + string init = "BG*YRGRRYR" ; + string goal = "BGGY*YRRRR" ; + int _ = 0; +END +CASE(1) + string init = "GBBB*BGBBG" ; + string goal = "RYYY*YRYYR"; + int _ = 9; +END +CASE(2) + string init = "RRBR*BRBBB" ; + string goal = "BBRB*RBRRR" ; + int _ = 1; +END +/* +CASE(3) + string init = ; + string goal = ; + int _ = ; +END +CASE(4) + string init = ; + string goal = ; + int _ = ; +END +*/ +} +// END CUT HERE