local ffi = require "ffi";

ffi.cdef[[
typedef struct {
	int x;
	int y;
	int z;
	int w;
	int t;
	int k;
} vec6;
]]

local mt = {}
mt.__index = mt

function mt:incx()
  self.x = self.x + 1;
end
function mt:incy()
  self.y = self.y + 1;
end
function mt:incz()
  self.z = self.z + 1;
end
function mt:incw()
  self.w = self.w + 1;
end
function mt:d3()
  return self.w % 3 == 0;
end
function mt:d5()
  return self.w % 5 == 0;
end
function mt:d7()
  return self.w % 7 == 0;
end

local maker = ffi.metatype("vec6", mt)
local function newvec6(x, y, z, w)
  return maker(x, y, z, w, 0, 0);
end

local function main(num)
	local c = newvec6(0, 0, 0, 0);
	while (c.w < num) do
		local d3, d5, d7 = c:d3(), c:d5(), c:d7();
		c.t = d3;
		c.x = c.x + c.t;
		c.k = d5;
		c.t = d3; c.t = 1 - c.t; c.t = c.t * c.k;
		c.y = c.y + c.t;
		c.t = d3; c.t = 1 - c.t; c.k = 1 - c.k; c.t = c.t * c.k;
		c.k = c.t
		c.t = d7
		c.t = c.t * c.k;
		c.z = c.z + c.t;
		c:incw();
	end
	return tonumber(c.z), tonumber(c.x), tonumber(c.y);
end

local n = tonumber(...);
local c7, c3, c5 = main(n);
print("c7: "..c7.." c3: "..c3.." c5: "..c5);
