SRM 310 div1

easyだけ解いた
二分探索してレベルを決定して、コーナーケースに気をつけながら表面積を計算する。
コーナーケースありすぎorz

#include <cstdio>
#include <algorithm>
#include <vector>
#include <string>
using namespace std;

typedef long long ll;
class PyramidOfCubes{
public:
	ll k;
	ll blocks(ll L){
		return L * (L + 1) * (2 * L + 1) / 6;
	}
	double solve(int n, int a){
		int t = n / a;
		n %= a;
		if(t == 0){
			return 2.0 + 2.0 * n;
		}
		if(n != 0) t++;
		return 2.0 * a + 2.0 * t;
	}
	double surface(int K){
		k = K;
		int h = 10000, l = 1;
		double ans = 0;
		bool f = false;
		for(int i = 0; i < 50; i++){
			int m = (h + l) / 2;
			if(blocks(m) == k){
				f = true;
				l = m;
				break;
			}
			if(blocks(m) < k)
				l = m;
			else
				h = m;
		}
		if(!f)l++;
		if(k < l * l) return solve(k, l) + 2.0 * k;
		ans = 2.0 * l * l;
		for(int i = l; i >= 1; i--){
			printf("%d %lld %lf\n", i, k, ans);
			if(i * i <= k){
				k -= i * i;
				ans += 4.0 * i;
			}else{
				if(k == 0) break;
				ans += solve(k, i);
				break;
			}
		}
		return ans;
	}
};