<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://mediawiki.zeropage.org/index.php?action=history&amp;feed=atom&amp;title=HowManyPiecesOfLand%EF%BC%9F%2F%EB%AC%B8%EB%B3%B4%EC%B0%BD</id>
	<title>HowManyPiecesOfLand？/문보창 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://mediawiki.zeropage.org/index.php?action=history&amp;feed=atom&amp;title=HowManyPiecesOfLand%EF%BC%9F%2F%EB%AC%B8%EB%B3%B4%EC%B0%BD"/>
	<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=HowManyPiecesOfLand%EF%BC%9F/%EB%AC%B8%EB%B3%B4%EC%B0%BD&amp;action=history"/>
	<updated>2026-05-15T14:23:47Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.8</generator>
	<entry>
		<id>https://mediawiki.zeropage.org/index.php?title=HowManyPiecesOfLand%EF%BC%9F/%EB%AC%B8%EB%B3%B4%EC%B0%BD&amp;diff=87188&amp;oldid=prev</id>
		<title>Maintenance script: Table transclusion repair v1</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=HowManyPiecesOfLand%EF%BC%9F/%EB%AC%B8%EB%B3%B4%EC%B0%BD&amp;diff=87188&amp;oldid=prev"/>
		<updated>2026-03-27T12:46:17Z</updated>

		<summary type="html">&lt;p&gt;Table transclusion repair v1&lt;/p&gt;
&lt;a href=&quot;https://mediawiki.zeropage.org/index.php?title=HowManyPiecesOfLand%EF%BC%9F/%EB%AC%B8%EB%B3%B4%EC%B0%BD&amp;amp;diff=87188&amp;amp;oldid=32395&quot;&gt;Show changes&lt;/a&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.zeropage.org/index.php?title=HowManyPiecesOfLand%EF%BC%9F/%EB%AC%B8%EB%B3%B4%EC%B0%BD&amp;diff=32395&amp;oldid=prev</id>
		<title>imported&gt;Unknown at 05:23, 7 February 2021</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=HowManyPiecesOfLand%EF%BC%9F/%EB%AC%B8%EB%B3%B4%EC%B0%BD&amp;diff=32395&amp;oldid=prev"/>
		<updated>2021-02-07T05:23:25Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== 소감 ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| 2006-01-08 Accepted 4.244 444&lt;br /&gt;
|}&lt;br /&gt;
Closed Form 구하는데 약 3~4시간 걸린 것 같다. 계차수열을 이용해서 다음과 같은 Closed Form을 구했다.&lt;br /&gt;
{{| T(n) = (n&amp;amp;lt;sup&amp;amp;gt;4&amp;amp;lt;/sup&amp;amp;gt; - 6n&amp;amp;lt;sup&amp;amp;gt;3&amp;amp;lt;/sup&amp;amp;gt; + 23n&amp;amp;lt;sup&amp;amp;gt;2&amp;amp;lt;/sup&amp;amp;gt; - 18n + 24) / 24 |}}&lt;br /&gt;
이론상으론 O(1) 시간만에 되겠지만 문제는 입력범위가 2 &amp;amp;lt;sup&amp;amp;gt;31&amp;amp;lt;/sup&amp;amp;gt; - 1 까지 들어올 수 있기 때문에 고정도 연산을 수행해야 한다. GNU C++ 이나 Java는 고정도 연산을 수행할 수 있는 클래스를 포함하고 있으나, 윈도우 C++에는 없다(혹, 내가 못찾는 것일수도 있다). 따라서 고정도 연산을 수행할 수 있는 클래스를 짰다. 성능이 너무 떨어진다. O(1) 을 O(n&amp;amp;lt;sup&amp;amp;gt;5&amp;amp;lt;/sup&amp;amp;gt;) 정도로 바꿔 놓은 듯한 느낌이다. 이 Class를 개선한뒤 다시 테스트 해봐야 겠다.&lt;br /&gt;
== 코드 ==&lt;br /&gt;
=== BigInteger.h ===&lt;br /&gt;
 //////////////////////////////////////////////////////////////////////////&lt;br /&gt;
 // Big Integer Class - C++&lt;br /&gt;
 // 만든이 : Moon, Bo-chang.&lt;br /&gt;
 // 만든 날짜 : 2006 / 1 / 7&lt;br /&gt;
 // 마지막으로 수정한 날짜 : &lt;br /&gt;
 // 주의 : 오버플로우 처리 안함&lt;br /&gt;
 // 지원하는 연산 : +(덧셈), -(뺄셈), *(곱셈), /(나눗셈) - 나눗셈 연산에서 나머지는 버린다.&lt;br /&gt;
 // 함수 호출이 모두 복사로 이루어지므로 성능이 크게 떨어진다.&lt;br /&gt;
 //////////////////////////////////////////////////////////////////////////&lt;br /&gt;
 &lt;br /&gt;
 #pragma once&lt;br /&gt;
 &lt;br /&gt;
 #include &amp;amp;lt;iostream&amp;amp;gt;&lt;br /&gt;
 using namespace std;&lt;br /&gt;
 #include &amp;amp;lt;cstring&amp;amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 #define MAXDIGITS	100&lt;br /&gt;
 #define PLUS		1				&lt;br /&gt;
 #define MINUS		-1			&lt;br /&gt;
 #define MAX(a,b) (((a) &amp;amp;gt; (b)) ? (a) : (b))&lt;br /&gt;
 &lt;br /&gt;
 class BigInteger &lt;br /&gt;
 {&lt;br /&gt;
 public:&lt;br /&gt;
 	char digit[MAXDIGITS];	&lt;br /&gt;
 	int signbit;			&lt;br /&gt;
 	int lastdigit;&lt;br /&gt;
 public:&lt;br /&gt;
 	BigInteger(int n)&lt;br /&gt;
 	{&lt;br /&gt;
 		int i;&lt;br /&gt;
 		lastdigit = 0;&lt;br /&gt;
 		signbit = (n &amp;amp;lt; 0) ? MINUS : PLUS;&lt;br /&gt;
 		while (n / 10)&lt;br /&gt;
 		{&lt;br /&gt;
 			digit[lastdigit++] = n % 10;&lt;br /&gt;
 			n /= 10;&lt;br /&gt;
 		}&lt;br /&gt;
 		digit[lastdigit] = n % 10;&lt;br /&gt;
 		for (i = lastdigit + 1; i &amp;amp;lt; MAXDIGITS; i++)&lt;br /&gt;
 			digit[i] = 0;	&lt;br /&gt;
 	}&lt;br /&gt;
 	BigInteger()&lt;br /&gt;
 	{&lt;br /&gt;
 		int i;&lt;br /&gt;
 		for (i = 0; i &amp;amp;lt; MAXDIGITS; i++)	&lt;br /&gt;
 			digit[i] = 0;&lt;br /&gt;
 		signbit = PLUS;&lt;br /&gt;
 		lastdigit = 0;&lt;br /&gt;
 	}&lt;br /&gt;
 	void print()&lt;br /&gt;
 	{&lt;br /&gt;
 		if (signbit == MINUS) cout &amp;amp;lt;&amp;amp;lt; &amp;quot;-&amp;quot;;&lt;br /&gt;
 		for (int i = lastdigit; i &amp;amp;gt;= 0; i--)&lt;br /&gt;
 			cout &amp;amp;lt;&amp;amp;lt; (int)digit[i];&lt;br /&gt;
 	}&lt;br /&gt;
 	void input()&lt;br /&gt;
 	{&lt;br /&gt;
 		int startI = 0;&lt;br /&gt;
 		int i, j;&lt;br /&gt;
 		char temp[MAXDIGITS];&lt;br /&gt;
 &lt;br /&gt;
 		while (cin.peek() == &amp;#039; &amp;#039; || cin.peek() == &amp;#039;\n&amp;#039;)&lt;br /&gt;
 			cin.get();&lt;br /&gt;
 &lt;br /&gt;
 		cin &amp;amp;gt;&amp;amp;gt; temp;&lt;br /&gt;
 		lastdigit = strlen(temp) - 1;&lt;br /&gt;
 		signbit = PLUS;&lt;br /&gt;
 		if (temp[0] == &amp;#039;-&amp;#039;) &lt;br /&gt;
 		{&lt;br /&gt;
 			signbit = MINUS;&lt;br /&gt;
 			startI = 1;&lt;br /&gt;
 			lastdigit--;&lt;br /&gt;
 		}&lt;br /&gt;
 		else if (temp[0] == &amp;#039;+&amp;#039;)&lt;br /&gt;
 		{&lt;br /&gt;
 			startI = 1;&lt;br /&gt;
 			lastdigit--;&lt;br /&gt;
 		}&lt;br /&gt;
 		j = 0;&lt;br /&gt;
 		for (i = lastdigit + startI; i &amp;amp;gt;= startI; i--)&lt;br /&gt;
 			digit[j++] = temp[i] - &amp;#039;0&amp;#039;;&lt;br /&gt;
 	}&lt;br /&gt;
 public:&lt;br /&gt;
 	friend void elminatePreZero(BigInteger&amp;amp;amp; n)&lt;br /&gt;
 	{&lt;br /&gt;
 		while (n.lastdigit &amp;amp;gt; 0 &amp;amp;amp;&amp;amp;amp; n.digit[n.lastdigit] == 0)	&lt;br /&gt;
 			n.lastdigit--;&lt;br /&gt;
 		if (n.lastdigit == 0 &amp;amp;amp;&amp;amp;amp; n.digit[0] == 0)&lt;br /&gt;
 			n.signbit = PLUS;&lt;br /&gt;
 	}&lt;br /&gt;
 	friend int compare(BigInteger&amp;amp;amp; a, BigInteger&amp;amp;amp; b)&lt;br /&gt;
 	{&lt;br /&gt;
 		int i;&lt;br /&gt;
 		if (a.signbit == MINUS &amp;amp;amp;&amp;amp;amp; b.signbit == PLUS) return PLUS;&lt;br /&gt;
 		if (a.signbit == PLUS &amp;amp;amp;&amp;amp;amp; b.signbit == MINUS) return MINUS;&lt;br /&gt;
 		if (b.lastdigit &amp;amp;gt; a.lastdigit) return (PLUS * a.signbit);&lt;br /&gt;
 		if (a.lastdigit &amp;amp;gt; b.lastdigit) return (MINUS * a.signbit);&lt;br /&gt;
 		for (i = a.lastdigit; i &amp;amp;gt;= 0; i--)&lt;br /&gt;
 		{&lt;br /&gt;
 			if (a.digit[i] &amp;amp;gt; b.digit[i])&lt;br /&gt;
 				return (MINUS * a.signbit);&lt;br /&gt;
 			if (b.digit[i] &amp;amp;gt; a.digit[i])&lt;br /&gt;
 				return (PLUS * a.signbit);&lt;br /&gt;
 		}&lt;br /&gt;
 		return 0;&lt;br /&gt;
 	}&lt;br /&gt;
 	friend void shiftDigit(BigInteger&amp;amp;amp; n, int d)&lt;br /&gt;
 	{&lt;br /&gt;
 		int i;&lt;br /&gt;
 		if (n.lastdigit == 0 &amp;amp;amp;&amp;amp;amp; n.digit[0] == 0) return;&lt;br /&gt;
 		for (i = n.lastdigit; i &amp;amp;gt;= 0; i--)&lt;br /&gt;
 			n.digit[i+d] = n.digit[i];&lt;br /&gt;
 		for (i = 0; i &amp;amp;lt; d; i++) n.digit[i] = 0;&lt;br /&gt;
 		n.lastdigit = n.lastdigit + d;&lt;br /&gt;
 	}&lt;br /&gt;
 	friend BigInteger operator+(BigInteger a, BigInteger b)&lt;br /&gt;
 	{&lt;br /&gt;
 		int carry;&lt;br /&gt;
 		BigInteger ret;&lt;br /&gt;
 		int i;&lt;br /&gt;
 &lt;br /&gt;
 		if (a.signbit == MINUS &amp;amp;amp;&amp;amp;amp; b.signbit == PLUS)&lt;br /&gt;
 		{&lt;br /&gt;
 			a.signbit = PLUS;&lt;br /&gt;
 			ret = b - a;&lt;br /&gt;
 			a.signbit = MINUS;&lt;br /&gt;
 		}&lt;br /&gt;
 		else if (a.signbit == PLUS &amp;amp;amp;&amp;amp;amp; b.signbit == MINUS)&lt;br /&gt;
 		{&lt;br /&gt;
 			b.signbit = PLUS;&lt;br /&gt;
 			ret = a - b;&lt;br /&gt;
 			b.signbit = MINUS;&lt;br /&gt;
 		}&lt;br /&gt;
 		else&lt;br /&gt;
 		{&lt;br /&gt;
 			ret.signbit = a.signbit;&lt;br /&gt;
 			ret.lastdigit = MAX(a.lastdigit, b.lastdigit) + 1;&lt;br /&gt;
 			carry = 0;&lt;br /&gt;
 			for (i = 0; i &amp;amp;lt;= ret.lastdigit; i++)&lt;br /&gt;
 			{&lt;br /&gt;
 				ret.digit[i] = (carry + a.digit[i] + b.digit[i]) % 10;&lt;br /&gt;
 				carry = (carry + a.digit[i] + b.digit[i]) / 10;&lt;br /&gt;
 			}&lt;br /&gt;
 			elminatePreZero(ret);&lt;br /&gt;
 		}&lt;br /&gt;
 		return ret;&lt;br /&gt;
 	}&lt;br /&gt;
 	friend BigInteger operator-(BigInteger a, BigInteger b)&lt;br /&gt;
 	{&lt;br /&gt;
 		BigInteger ret;&lt;br /&gt;
 		int borrow, v;&lt;br /&gt;
 		int i;&lt;br /&gt;
 &lt;br /&gt;
 		if (a.signbit == MINUS || b.signbit == MINUS)&lt;br /&gt;
 		{&lt;br /&gt;
 			b.signbit = -1 * b.signbit;&lt;br /&gt;
 			ret = a + b;&lt;br /&gt;
 			b.signbit = -1 * b.signbit;&lt;br /&gt;
 			return ret;&lt;br /&gt;
 		}&lt;br /&gt;
 		if (compare(a,b) == PLUS)&lt;br /&gt;
 		{&lt;br /&gt;
 			ret = b - a;&lt;br /&gt;
 			ret.signbit = MINUS;&lt;br /&gt;
 			return ret;&lt;br /&gt;
 		}&lt;br /&gt;
 		ret.lastdigit = MAX(a.lastdigit,b.lastdigit);&lt;br /&gt;
 		borrow = 0;&lt;br /&gt;
 		for (i = 0; i &amp;amp;lt;= ret.lastdigit; i++)&lt;br /&gt;
 		{&lt;br /&gt;
 			v = a.digit[i] - borrow - b.digit[i];&lt;br /&gt;
 			if (a.digit[i] &amp;amp;gt; 0)&lt;br /&gt;
 				borrow = 0;&lt;br /&gt;
 			if (v &amp;amp;lt; 0)&lt;br /&gt;
 			{&lt;br /&gt;
 				v = v + 10;&lt;br /&gt;
 				borrow = 1;&lt;br /&gt;
 			}&lt;br /&gt;
 			ret.digit[i] = v % 10;&lt;br /&gt;
 		}&lt;br /&gt;
 		elminatePreZero(ret);&lt;br /&gt;
 		return ret;&lt;br /&gt;
 	}&lt;br /&gt;
 	friend BigInteger operator*(BigInteger a, BigInteger b)&lt;br /&gt;
 	{&lt;br /&gt;
 		BigInteger row, tmp, ret;&lt;br /&gt;
 		int i, j;&lt;br /&gt;
 &lt;br /&gt;
 		row = a;&lt;br /&gt;
 		for (i = 0; i &amp;amp;lt;= b.lastdigit; i++)&lt;br /&gt;
 		{&lt;br /&gt;
 			for (j = 1; j &amp;amp;lt;= b.digit[i]; j++)&lt;br /&gt;
 			{&lt;br /&gt;
 				tmp = ret + row;&lt;br /&gt;
 				ret = tmp;&lt;br /&gt;
 			}&lt;br /&gt;
 			shiftDigit(row, 1);&lt;br /&gt;
 		}&lt;br /&gt;
 		ret.signbit = a.signbit * b.signbit;&lt;br /&gt;
 		elminatePreZero(ret);&lt;br /&gt;
 		return ret;&lt;br /&gt;
 	}&lt;br /&gt;
 	friend BigInteger operator/(BigInteger a, BigInteger b)&lt;br /&gt;
 	{&lt;br /&gt;
 		BigInteger row, tmp, ret;&lt;br /&gt;
 		int asign, bsign;&lt;br /&gt;
 		int i;&lt;br /&gt;
 &lt;br /&gt;
 		ret.signbit = a.signbit * b.signbit;&lt;br /&gt;
 		asign = a.signbit;&lt;br /&gt;
 		bsign = b.signbit;&lt;br /&gt;
 		a.signbit = PLUS;&lt;br /&gt;
 		b.signbit = PLUS;&lt;br /&gt;
 		ret.lastdigit = a.lastdigit;&lt;br /&gt;
 		&lt;br /&gt;
 		for (i = a.lastdigit; i &amp;amp;gt;= 0; i--)&lt;br /&gt;
 		{&lt;br /&gt;
 			shiftDigit(row, 1);&lt;br /&gt;
 			row.digit[0] = a.digit[i];&lt;br /&gt;
 			ret.digit[i] = 0;&lt;br /&gt;
 			while (compare(row, b) != PLUS)&lt;br /&gt;
 			{&lt;br /&gt;
 				ret.digit[i]++;&lt;br /&gt;
 				tmp = row - b;&lt;br /&gt;
 				row = tmp;&lt;br /&gt;
 			}&lt;br /&gt;
 		}&lt;br /&gt;
 		elminatePreZero(ret);&lt;br /&gt;
 		a.signbit = asign;&lt;br /&gt;
 		b.signbit = bsign;&lt;br /&gt;
 		return ret;		&lt;br /&gt;
 	}&lt;br /&gt;
 };&lt;br /&gt;
=== main.cpp ===&lt;br /&gt;
 #include &amp;quot;BigInteger.h&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 int main()&lt;br /&gt;
 {&lt;br /&gt;
 	int nCase;&lt;br /&gt;
 	BigInteger a(6), b(23), c(18), d(24);&lt;br /&gt;
 	BigInteger n, result;&lt;br /&gt;
 	cin &amp;amp;gt;&amp;amp;gt; nCase;&lt;br /&gt;
 	for (int i = 0; i &amp;amp;lt; nCase; i++)&lt;br /&gt;
 	{&lt;br /&gt;
 		n.input();&lt;br /&gt;
 		result = (n * n * n * n - a * n * n * n + b * n * n - c * n + d) / d;&lt;br /&gt;
 		result.print();&lt;br /&gt;
 		cout &amp;amp;lt;&amp;amp;lt; endl;&lt;br /&gt;
 	}&lt;br /&gt;
 	return 0;&lt;br /&gt;
 }&lt;br /&gt;
----&lt;br /&gt;
[[HowManyPiecesOfLand？]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Unknown</name></author>
	</entry>
</feed>