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 <iostream> +#include <sstream> +#include <iomanip> +#include <vector> +#include <string> +#include <map> +#include <set> +#include <algorithm> +#include <numeric> +#include <iterator> +#include <functional> +#include <complex> +#include <queue> +#include <stack> +#include <cmath> +#include <cassert> +using namespace std; +typedef long long LL; +typedef long double LD; +typedef complex<LD> CMP; + +struct UnionFind +{ + vector<int> uf, sz; + int nc; + + UnionFind(int N): uf(N), sz(N,1), nc(N) + { for(int i=0; i<N; ++i) uf[i] = i; } + int size() + { return nc; } + int size(int a) + { return sz[Find(a)]; } + int Find(int a) + { return uf[a]==a ? a : uf[a]=Find(uf[a]); } + bool Union(int a, int b) + { + a = Find(a); + b = Find(b); + if( a != b ) + { + if( sz[a] >= 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<h; ++y) + for(int x=0; x<w; ++x) + for(int d=0; d<8; ++d) { + int yy = y+dy[d]; + int xx = x+dx[d]; + if(0<=yy && yy<h && 0<=xx && xx<w) + uf.Union(y*w+x, yy*w+xx); + } + + int m = 0; + for(int i=0; i<w*h; ++i) + m = max(m, uf.size(i)); + return m; + } +}; + +// BEGIN CUT HERE +#include <ctime> +double start_time; string timer() + { ostringstream os; os << " (" << int((clock()-start_time)/CLOCKS_PER_SEC*1000) << " msec)"; return os.str(); } +template<typename T> ostream& operator<<(ostream& os, const vector<T>& v) + { os << "{ "; + for(typename vector<T>::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 <iostream> +#include <sstream> +#include <iomanip> +#include <vector> +#include <string> +#include <map> +#include <set> +#include <algorithm> +#include <numeric> +#include <iterator> +#include <functional> +#include <complex> +#include <queue> +#include <stack> +#include <cmath> +#include <cassert> +using namespace std; +typedef long long LL; +typedef long double LD; +typedef complex<LD> 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 <ctime> +double start_time; string timer() + { ostringstream os; os << " (" << int((clock()-start_time)/CLOCKS_PER_SEC*1000) << " msec)"; return os.str(); } +template<typename T> ostream& operator<<(ostream& os, const vector<T>& v) + { os << "{ "; + for(typename vector<T>::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 <iostream> +#include <sstream> +#include <iomanip> +#include <vector> +#include <string> +#include <map> +#include <set> +#include <algorithm> +#include <numeric> +#include <iterator> +#include <functional> +#include <complex> +#include <queue> +#include <stack> +#include <cmath> +#include <cassert> +using namespace std; +typedef long long LL; +typedef long double LD; +typedef complex<LD> 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 <int> cards, int n) + { + int n_msb = 0; + while( (1<<n_msb+1) <= n ) {} + + vector<int> cc(30); + vector<int> more; + for(int i=0; i<cards.size(); ++i) { + for(int k=0; k<=29; ++k) + { + if((1<<k)<=cards[i] && cards[i]<(1<<k+1)) + cc[k].push_back(cards[i]); + } + } + + mint p = 0; + for(int k=29; k>=0; --k) + { + int BIT = (n>>k)&1; + + int up = 0; + + vector<int> rel; + for(int i=0; i<cards.size(); ++i) + if( (1<<k) <= cards[i] ) { + if( (1<<k+1) <= cards[i] ) + up ^= cards[i]; + if( (1<<k) & cards[i] ) + rel.push_back(i); + } + + // all take above + if( (up>>k+1) == (n>>k+1) ) + { + for(int ri=0; ri<rel.size(); ++ri) + { + int i = rel[ri]; + } + } + } + return p.val; + } +}; + +// BEGIN CUT HERE +#include <ctime> +double start_time; string timer() + { ostringstream os; os << " (" << int((clock()-start_time)/CLOCKS_PER_SEC*1000) << " msec)"; return os.str(); } +template<typename T> ostream& operator<<(ostream& os, const vector<T>& v) + { os << "{ "; + for(typename vector<T>::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 <int> cards(cards_, cards_+sizeof(cards_)/sizeof(*cards_)); + int n = 2; + int _ = 3; +END +CASE(1) + int cards_[] = {1,2,3}; + vector <int> cards(cards_, cards_+sizeof(cards_)/sizeof(*cards_)); + int n = 1; + int _ = 6; +END +CASE(2) + int cards_[] = {4, 5, 7, 11}; + vector <int> 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 <int> 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 <int> 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 <int> cards(cards_, cards_+sizeof(cards_)/sizeof(*cards_)); + int n = 1; + int _ = 949480669; +END +/* +CASE(6) + int cards_[] = ; + vector <int> cards(cards_, cards_+sizeof(cards_)/sizeof(*cards_)); + int n = ; + int _ = ; +END +CASE(7) + int cards_[] = ; + vector <int> cards(cards_, cards_+sizeof(cards_)/sizeof(*cards_)); + int n = ; + int _ = ; +END +*/ +} +// END CUT HERE