ADDED SRM/564-U/1A.cpp Index: SRM/564-U/1A.cpp ================================================================== --- SRM/564-U/1A.cpp +++ SRM/564-U/1A.cpp @@ -0,0 +1,119 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +using namespace std; +typedef long long LL; +typedef long double LD; +typedef complex CMP; + +struct UnionFind +{ + vector uf, sz; + int nc; + + UnionFind(int N): uf(N), sz(N,1), nc(N) + { for(int i=0; i= sz[b] ) swap(a, b); + uf[a] = b; + sz[b] += sz[a]; + --nc; + } + return (a!=b); + } +}; + +class KnightCircuit2 { public: + int maxSize(int w, int h) + { + if( w>=4 && h>=4 ) + return w*h; + + UnionFind uf(w*h); + int dy[] = {+2,+2,-2,-2,+1,+1,-1,-1}; + int dx[] = {+1,-1,+1,-1,+2,-2,+2,-2}; + for(int y=0; y +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(_, KnightCircuit2().maxSize(w, h));} +int main(){ + +CASE(0) + int w = 1; + int h = 1; + int _ = 1; +END +CASE(1) + int w = 15; + int h = 2; + int _ = 8; +END +CASE(2) + int w = 100; + int h = 100; + int _ = 10000; +END +/* +CASE(3) + int w = ; + int h = ; + int _ = ; +END +CASE(4) + int w = ; + int h = ; + int _ = ; +END +*/ +} +// END CUT HERE ADDED SRM/564-U/1B.cpp Index: SRM/564-U/1B.cpp ================================================================== --- SRM/564-U/1B.cpp +++ SRM/564-U/1B.cpp @@ -0,0 +1,142 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +using namespace std; +typedef long long LL; +typedef long double LD; +typedef complex CMP; + +class AlternateColors2 { public: + long long countWays(int n, int k) + { + LL total = 0; + for(int mini=0; mini*3<=n; ++mini) + { + if(mini*3 == n) { + total += rgb(mini, mini, mini, k) ? 1 : 0; + } else { + total += rgb(mini, mini, n-mini*2, k) ? 1 : 0; + total += rgb(mini, n-mini*2, mini, k) ? 1 : 0; + total += rgb(n-mini*2, mini, mini, k) ? 1 : 0; + int free = n - mini*3; + if(free >= 2) { + if(k <= mini*3) { + if((k-1)%3==0) { + total += (free - 1)*3; + } + } else { + total += twoball(free, k-mini*3) * 2; + } + } + } + } + return total; + } + + bool rgb(int r, int g, int b, int k) { + int mini = min(r, min(g, b)); + if( k <= mini*3 ) + return (k-1)%3==0; + r -= mini; + g -= mini; + b -= mini; + k -= mini*3; + if(r==0) return false; + if(g==0) return xx(r,b,k); + if(b==0) return xx(r,g,k); + } + + bool xx(int r, int g, int k) + { + int mini = min(r,g); + if( k <= mini*2 ) + return (k-1)%2 == 0; + r -= mini; + g -= mini; + k -= mini*2; + return r>0; + } + + LL twoball(int n, int k) + { + int MM = (k-1)/2; + LL total = MM; + if( (MM+1)*2 <= n && (k-1)%2==0 ) + total += (n-(MM+1)*2 + 1); + return total; + } +}; + +// 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 long long& Expected, const long long& 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(_, AlternateColors2().countWays(n, k));} +int main(){ + +CASE(0) + int n = 1; + int k = 1; + long long _ = 1LL; +END +CASE(1) + int n = 3; + int k = 3; + long long _ = 3LL; +END +CASE(2) + int n = 6; + int k = 4; + long long _ = 9LL; +END +CASE(3) + int n = 6; + int k = 1; + long long _ = 21LL; +END +CASE(4) + int n = 1000; + int k = 2; + long long _ = 1LL; +END +CASE(5) + int n = 100000; + int k = 100000; + long long _ = 1666700000LL; +END +CASE(6) + int n = 100000; + int k = 100; + long long _ = -1LL; +END +/* +CASE(7) + int n = ; + int k = ; + long long _ = LL; +END +*/ +} +// END CUT HERE ADDED SRM/564-U/1C-U.cpp Index: SRM/564-U/1C-U.cpp ================================================================== --- SRM/564-U/1C-U.cpp +++ SRM/564-U/1C-U.cpp @@ -0,0 +1,154 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +using namespace std; +typedef long long LL; +typedef long double LD; +typedef complex CMP; + +static const unsigned MODVAL = 1000000007; +struct mint +{ + unsigned val; + mint():val(0){} + mint(int x):val(x%MODVAL) {} + mint(unsigned x):val(x%MODVAL) {} + mint(LL x):val(x%MODVAL) {} +}; +mint& operator+=(mint& x, mint y) { return x = x.val+y.val; } +mint& operator-=(mint& x, mint y) { return x = x.val-y.val+MODVAL; } +mint& operator*=(mint& x, mint y) { return x = LL(x.val)*y.val; } +mint operator+(mint x, mint y) { return x+=y; } +mint operator-(mint x, mint y) { return x-=y; } +mint operator*(mint x, mint y) { return x*=y; } + +mint POW(mint x, LL e) { mint v=1; for(;e;x*=x,e>>=1) if(e&1) v*=x; return v; } +mint& operator/=(mint& x, mint y) { return x *= POW(y, MODVAL-2); } +mint operator/(mint x, mint y) { return x/=y; } + +class DefectiveAddition { public: + int count(vector cards, int n) + { + int n_msb = 0; + while( (1< cc(30); + vector more; + for(int i=0; i=0; --k) + { + int BIT = (n>>k)&1; + + int up = 0; + + vector rel; + for(int i=0; i>k+1) == (n>>k+1) ) + { + for(int ri=0; ri +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(_, DefectiveAddition().count(cards, n));} +int main(){ + +CASE(0) + int cards_[] = {2,3}; + vector cards(cards_, cards_+sizeof(cards_)/sizeof(*cards_)); + int n = 2; + int _ = 3; +END +CASE(1) + int cards_[] = {1,2,3}; + vector cards(cards_, cards_+sizeof(cards_)/sizeof(*cards_)); + int n = 1; + int _ = 6; +END +CASE(2) + int cards_[] = {4, 5, 7, 11}; + vector cards(cards_, cards_+sizeof(cards_)/sizeof(*cards_)); + int n = 6; + int _ = 240; +END +CASE(3) + int cards_[] = {1,2,3,4,5,6,7,8,9,10}; + vector cards(cards_, cards_+sizeof(cards_)/sizeof(*cards_)); + int n = 15; + int _ = 1965600; +END +CASE(4) + int cards_[] = {1,2,3,4,5,6,7,8,9,10}; + vector cards(cards_, cards_+sizeof(cards_)/sizeof(*cards_)); + int n = 16; + int _ = 0; +END +CASE(5) + int cards_[] = {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}; + vector cards(cards_, cards_+sizeof(cards_)/sizeof(*cards_)); + int n = 1; + int _ = 949480669; +END +/* +CASE(6) + int cards_[] = ; + vector cards(cards_, cards_+sizeof(cards_)/sizeof(*cards_)); + int n = ; + int _ = ; +END +CASE(7) + int cards_[] = ; + vector cards(cards_, cards_+sizeof(cards_)/sizeof(*cards_)); + int n = ; + int _ = ; +END +*/ +} +// END CUT HERE