diff --git a/2017/8 April/Problem A/main.cpp b/2017/8 April/Problem A/main.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..75f36e04a1dee2c7febe56d696b7e2f46f07f785
--- /dev/null
+++ b/2017/8 April/Problem A/main.cpp	
@@ -0,0 +1,40 @@
+#include <bits/stdc++.h>
+
+using namespace std;
+
+int N, K;
+char S[10000];
+
+void _main(int TEST)
+{
+    scanf("%s%d", S, &K);
+    N=strlen(S);
+    int ans=0;
+    for(int i=0; i+K-1<N; i++) if(S[i]=='-')
+    {
+        for(int j=0; j<K; j++)
+            S[i+j]^='-'^'+';
+        ans++;
+    }
+    for(int i=0; i<N; i++) if(S[i]=='-')
+        ans=-1;
+    if(ans==-1)
+        printf("IMPOSSIBLE\n");
+    else
+        printf("%d\n", ans);
+}
+
+int main()
+{
+    freopen("A-large.in", "r", stdin);
+    freopen("A-large.out", "w", stdout);
+    int TEST;
+    scanf("%d", &TEST);
+    for(int i=1; i<=TEST; i++)
+    {
+        //cerr << i << endl;
+        printf("Case #%d: ", i);
+        _main(i);
+    }
+    return 0;
+}
diff --git a/2017/8 April/Solutions/pancake.cpp b/2017/8 April/Problem A/pancake.cpp
similarity index 100%
rename from 2017/8 April/Solutions/pancake.cpp
rename to 2017/8 April/Problem A/pancake.cpp
diff --git a/2017/8 April/Problem B/main.cpp b/2017/8 April/Problem B/main.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..432f5825dc80c730068074a5afeb10840706cd7c
--- /dev/null
+++ b/2017/8 April/Problem B/main.cpp	
@@ -0,0 +1,36 @@
+#include <bits/stdc++.h>
+
+using namespace std;
+
+long long N;
+
+long long rec(__int128 cur, int last)
+{
+    if(cur>N)
+        return 0;
+    long long ret=cur;
+    for(; last<=9; last++)
+        ret=max(ret, rec(cur*10+last, last));
+    return ret;
+}
+
+void _main(int TEST)
+{
+    scanf("%lld", &N);
+    printf("%lld\n", rec(0, 1));
+}
+
+int main()
+{
+    freopen("B-large.in", "r", stdin);
+    freopen("B-large.out", "w", stdout);
+    int TEST;
+    scanf("%d", &TEST);
+    for(int i=1; i<=TEST; i++)
+    {
+        //cerr << i << endl;
+        printf("Case #%d: ", i);
+        _main(i);
+    }
+    return 0;
+}
diff --git a/2017/8 April/Solutions/tidynumber.cpp b/2017/8 April/Problem B/tidynumber.cpp
similarity index 100%
rename from 2017/8 April/Solutions/tidynumber.cpp
rename to 2017/8 April/Problem B/tidynumber.cpp
diff --git a/2017/8 April/Solutions/tidynumberlarge.cpp b/2017/8 April/Problem B/tidynumberlarge.cpp
similarity index 100%
rename from 2017/8 April/Solutions/tidynumberlarge.cpp
rename to 2017/8 April/Problem B/tidynumberlarge.cpp
diff --git a/2017/8 April/Problem C/bathroom.cpp b/2017/8 April/Problem C/bathroom.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..a33ff188b4e46079db1f4c613ceb5bec7c00cbcf
--- /dev/null
+++ b/2017/8 April/Problem C/bathroom.cpp	
@@ -0,0 +1,88 @@
+#include <cstdint>
+#include <iostream>
+#include <array>
+#include <cmath>
+
+using namespace std;
+
+array<uint64_t, 2> bathroom(uint64_t k, uint64_t n) {
+    uint64_t a = k >> 1;
+    array<uint64_t, 2> ret;
+    cout << k << ", " << n << endl;
+    if (n == 1) {
+	if (k&1) {
+	    ret[0] = a;
+	    ret[1] = a;
+	    return ret;
+	}
+	ret[0] = a;
+	ret[1] = a-1;
+	return ret;
+    }
+    if (n == 2)
+	return bathroom(k >> 1, 1);
+    if (n == 3) {
+	if (k&1)
+	    return bathroom((k >> 1), 1);
+	return bathroom((k >> 1) -1, 1);
+    }
+    int downpower2 = (int)log2(k);
+    if ( n >= (1 << downpower2) || k - n < (1 << (downpower2-1))) {
+	cout << "straight to 0, 0" << endl;
+	ret[0] = 0;
+	ret[1] = 0;
+	return ret;
+    }
+    //*
+    if (n >= (1 << (downpower2-1)) && n < (1 << (downpower2))) {
+	cout << "straight to 1, 0 from ";
+	if (n >= (1 << (downpower2-1))) 
+	    cout << "first term" << endl;
+	else
+	    cout << "second term" << endl;
+	ret[0] = 1;
+	if ( (1<<(downpower2+1)) -1 == k)
+	    ret[1] = 1;
+	else
+	    ret[1] = 0;
+	return ret;
+    }//*/
+    int d = (1 << (downpower2 - 1));
+    d = (int)log2(k-d) + 1;
+    ret = bathroom((k-d), n);
+    if (ret[0] == ret[1]) {
+	ret[0] += 1;
+	cout << "increased to " << ret[0] << ", " << ret[1] << endl;
+	return ret;
+    }
+    	cout << "increased to " << ret[0] << ", " << ret[1] + 1 << endl;
+	ret[1] += 1;
+	return ret;
+}
+
+int main()
+{
+    int numCases = 0;
+    cin >> numCases;
+
+    for (int q = 0; q < numCases; q++)
+    {
+	uint64_t k = 0;
+	cin >> k;
+
+	uint64_t n = 0;
+	cin >> n;
+
+	uint64_t highest = 0;
+
+	uint64_t lowest = 0;
+
+	auto thing = bathroom(k, n);
+
+	highest = thing[0];
+	lowest = thing[1];
+	
+	cout << "Case #" << q+1 << ": " << highest << " " << lowest << endl;
+    }
+    return 0;
+}
diff --git a/2017/8 April/Problem C/main.cpp b/2017/8 April/Problem C/main.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..74a49fe4268ffeddd162b308124eca7ceec7c9a2
--- /dev/null
+++ b/2017/8 April/Problem C/main.cpp	
@@ -0,0 +1,45 @@
+#include <bits/stdc++.h>
+
+using namespace std;
+
+long long N, K;
+
+void _main(int TEST)
+{
+    scanf("%lld%lld", &N, &K);
+    map<long long, long long> Q;
+    Q[N]=1;
+    while(!Q.empty())
+    {
+        long long n=(--Q.end())->first;
+        long long k=(--Q.end())->second;
+        if(k==0)
+            continue;
+        if(k>=K)
+        {
+            printf("%lld %lld\n", n/2, (n-1)/2);
+            break;
+        }
+        K-=k;
+        Q.erase(--Q.end());
+        if(n/2>0)
+            Q[n/2]+=k;
+        if((n-1)/2>0)
+            Q[(n-1)/2]+=k;
+    }
+}
+
+int main()
+{
+    freopen("C-large.in", "r", stdin);
+    freopen("C-large.out", "w", stdout);
+    int TEST;
+    scanf("%d", &TEST);
+    for(int i=1; i<=TEST; i++)
+    {
+        //cerr << i << endl;
+        printf("Case #%d: ", i);
+        _main(i);
+    }
+    return 0;
+}
diff --git a/2017/8 April/Solutions/fashion.cpp b/2017/8 April/Problem D/fashion.cpp
similarity index 82%
rename from 2017/8 April/Solutions/fashion.cpp
rename to 2017/8 April/Problem D/fashion.cpp
index 00706de4133a549c50d0ae4213c2fd9a4112f229..79b1fb02f61e74e87408cb832d45d92bc9b7abc6 100644
--- a/2017/8 April/Solutions/fashion.cpp	
+++ b/2017/8 April/Problem D/fashion.cpp	
@@ -68,6 +68,26 @@ bool isLegalColumn(vector<vector<char>>& grid, int columnNum) {
 	case '.':
 	    continue;
 	case 'x':
+	case 'o':
+	    if (lastWasOut)
+		return false;
+	    lastWasOut = true;
+	    break;
+	case '+':
+	    lastWasOut = false;
+	}
+    }
+    return true;
+}
+
+bool isLegalDiagonal(vector<vector<char>>& grid, int columnNum, int rowNum) {
+    bool lastWasOut = false;
+    int c = columnNum + rowNum;
+    for (int i = 0; i <= c; i++) {
+	switch(grid[i][c-i]) {
+	case '.':
+	    continue;
+	case '+':
 	case 'o':
 	    if (lastWasOut)
 		return false;
@@ -77,8 +97,8 @@ bool isLegalColumn(vector<vector<char>>& grid, int columnNum) {
 	    lastWasOut = false;
 	}
     }
+    int c = 
     return true;
-}	    
 
 void doStuff(vector<vector<char>>& grid) {
     int score = calculateScore(grid);
diff --git a/2017/8 April/Problem D/main.cpp b/2017/8 April/Problem D/main.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..7590320b23fce5727a4bce2a57849460c2ee59d5
--- /dev/null
+++ b/2017/8 April/Problem D/main.cpp	
@@ -0,0 +1,104 @@
+#include <bits/stdc++.h>
+
+using namespace std;
+
+int N, M;
+int ta[100][100];
+int tb[100][100];
+int ch[100][100];
+
+void _main(int TEST)
+{
+    memset(ta, 0, sizeof ta);
+    memset(tb, 0, sizeof tb);
+    memset(ch, 0, sizeof ch);
+    scanf("%d%d", &N, &M);
+    map<int, int> diag1, diag2, axis1, axis2;
+    for(int i=0; i<N; i++)
+        for(int j=0; j<N; j++)
+            diag1[i+j]=diag2[i-j]=axis1[i]=axis2[j]=1;
+    char c;
+    for(int i=0; i<M; i++)
+    {
+        int x, y;
+        scanf(" %c%d%d", &c, &x, &y);
+        x--, y--;
+        if(c!='x')
+            diag1[x+y]=diag2[x-y]=0, tb[x][y]++;
+        if(c!='+')
+            axis1[x]=axis2[y]=0, ta[x][y]++;
+    }
+    map<int, int> m;
+    for(int i=0; i<N; i++)
+        for(int j=0; j<N; j++)
+            m[i+j]++;
+    vector<pair<int, int>> v;
+    for(auto& it: m)
+        v.push_back({it.second, it.first});
+    sort(v.begin(), v.end());
+    for(int i=0; i<(int)v.size(); i++)
+    {
+        int s=v[i].second;
+        if(diag1[s]==0)
+            continue;
+        for(int x=0; x<N; x++)
+        {
+            int y=s-x;
+            if(y<0 || y>=N)
+                continue;
+            if(diag2[x-y])
+            {
+                diag1[x+y]=diag2[x-y]=0;
+                tb[x][y]++;
+                ch[x][y]=1;
+                break;
+            }
+        }
+    }
+    for(int i=0; i<N; i++) if(axis1[i])
+    {
+        for(int j=0; j<N; j++) if(axis2[j])
+        {
+            axis1[i]=axis2[j]=0;
+            ta[i][j]++;
+            ch[i][j]=1;
+            break;
+        }
+    }
+    int ans=0;
+    vector<pair<char, pair<int, int>>> rans;
+    for(int i=0; i<N; i++)
+        for(int j=0; j<N; j++)
+        {
+            ans+=ta[i][j]+tb[i][j];
+            if(ch[i][j])
+            {
+                if(ta[i][j] && tb[i][j])
+                    rans.push_back({'o', {i+1, j+1}});
+                else if(ta[i][j])
+                    rans.push_back({'x', {i+1, j+1}});
+                else if(tb[i][j])
+                    rans.push_back({'+', {i+1, j+1}});
+                else
+                    assert(0);
+            }
+        }
+    printf("%d %d\n", ans, (int)rans.size());
+    for(auto& it: rans)
+        printf("%c %d %d\n", it.first, it.second.first, it.second.second);
+}
+
+int main()
+{
+    freopen("D-large.in", "r", stdin);
+    freopen("D-large.out", "w", stdout);
+    int TEST;
+    scanf("%d", &TEST);
+    for(int i=1; i<=TEST; i++)
+    {
+        //cerr << i << endl;
+        printf("Case #%d: ", i);
+        _main(i);
+    }
+    return 0;
+}
diff --git a/2017/8 April/Solutions/bathroom.cpp b/2017/8 April/Solutions/bathroom.cpp
deleted file mode 100644
index 86805bb9bb3f63d00e7c99e8dc335807d96d31f1..0000000000000000000000000000000000000000
--- a/2017/8 April/Solutions/bathroom.cpp	
+++ /dev/null
@@ -1,35 +0,0 @@
-#include <cstdint>
-#include <iostream>
-#include <array>
-
-using namespace std;
-
-array<uint64_t, 2> bathroom(uint64_t k, uint64_t n) {
-}
-
-int main()
-{
-    int numCases = 0;
-    cin >> numCases;
-
-    for (int q = 0; q < numCases; q++)
-    {
-	uint64_t k = 0;
-	cin >> k;
-
-	uint64_t n = 0;
-	cin >> n;
-
-	uint64_t highest = 0;
-
-	uint64_t lowest = 0;
-
-	auto thing = bathroom(k, n);
-
-	highest = thing[0];
-	lowest = thing[1];
-	
-	cout << "Case #" << q+1 << ": " << highest << " " << lowest << endl;
-    }
-    return 0;
-}