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