結果

問題 No.1797 永遠のグリッド
ユーザー pengin_2000pengin_2000
提出日時 2022-08-22 23:07:02
言語 C
(gcc 12.3.0)
結果
AC  
実行時間 198 ms / 2,000 ms
コード長 1,438 bytes
コンパイル時間 488 ms
コンパイル使用メモリ 34,456 KB
実行使用メモリ 6,944 KB
最終ジャッジ日時 2024-04-18 13:31:46
合計ジャッジ時間 1,908 ms
ジャッジサーバーID
(参考情報)
judge5 / judge4
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 1 ms
6,812 KB
testcase_01 AC 0 ms
6,944 KB
testcase_02 AC 1 ms
6,940 KB
testcase_03 AC 1 ms
6,940 KB
testcase_04 AC 1 ms
6,940 KB
testcase_05 AC 1 ms
6,944 KB
testcase_06 AC 1 ms
6,940 KB
testcase_07 AC 1 ms
6,944 KB
testcase_08 AC 1 ms
6,944 KB
testcase_09 AC 4 ms
6,940 KB
testcase_10 AC 1 ms
6,940 KB
testcase_11 AC 1 ms
6,940 KB
testcase_12 AC 1 ms
6,940 KB
testcase_13 AC 2 ms
6,940 KB
testcase_14 AC 1 ms
6,940 KB
testcase_15 AC 0 ms
6,940 KB
testcase_16 AC 1 ms
6,944 KB
testcase_17 AC 21 ms
6,940 KB
testcase_18 AC 70 ms
6,940 KB
testcase_19 AC 1 ms
6,940 KB
testcase_20 AC 67 ms
6,940 KB
testcase_21 AC 23 ms
6,940 KB
testcase_22 AC 9 ms
6,940 KB
testcase_23 AC 96 ms
6,940 KB
testcase_24 AC 15 ms
6,940 KB
testcase_25 AC 55 ms
6,940 KB
testcase_26 AC 198 ms
6,944 KB
testcase_27 AC 1 ms
6,944 KB
testcase_28 AC 1 ms
6,940 KB
testcase_29 AC 22 ms
6,944 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#include<stdio.h>
int p[60004];
int root(int n)
{
	if (p[n] != n)
		p[n] = root(p[n]);
	return p[n];
}
void uni(int a, int b)
{
	a = root(a);
	b = root(b);
	p[a] = b;
	return;
}
int v[10][10];
int h, w;
int g(int k)
{
	int i, j, res = 0;
	for (i = 0; i < h; i++)
		for (j = 0; j < w; j++)
			res = k * res + v[i][j];
	return res;
}
int f(int k)
{
	int i, j, l, ll;
	int max = 1;
	for (i = 0; i < h; i++)
		for (j = 0; j < w; j++)
			max *= k;
	for (i = 0; i < max; i++)
		p[i] = i;
	int vv[10][10], ii, jj;
	for (l = 0; l < max; l++)
	{
		ll = l;
		for (i = h - 1; i >= 0; i--)
		{
			for (j = w - 1; j >= 0; j--)
			{
				v[i][j] = ll % k;
				ll /= k;
			}
		}
		for (i = 0; i <= h; i++)
		{
			for (j = 0; j <= w; j++)
			{
				uni(l, g(k));
				for (ii = 0; ii < h; ii++)
					for (jj = 0; jj < w; jj++)
						vv[ii][jj] = v[ii][(jj + 1) % w];
				for (ii = 0; ii < h; ii++)
					for (jj = 0; jj < w; jj++)
						v[ii][jj] = vv[ii][jj];
			}
			for (ii = 0; ii < h; ii++)
				for (jj = 0; jj < w; jj++)
					vv[ii][jj] = v[(ii + 1) % h][jj];
			for (ii = 0; ii < h; ii++)
				for (jj = 0; jj < w; jj++)
					v[ii][jj] = vv[ii][jj];
		}
	}
	int ans = 0;
	for (i = 0; i < max; i++)
		if (root(i) == i)
			ans++;
	return ans;
}
int main()
{
	int k;
	scanf("%d %d %d", &h, &w, &k);
	int ans;
	if (k == 1)
		ans = f(1);
	else if (k == 2)
		ans = f(2) - 2 * f(1);
	else
		ans = f(3) - 3 * f(2) + 3 * f(1);
	printf("%d\n", ans);
	return 0;
}
0