結果
| 問題 | 
                            No.1797 永遠のグリッド
                             | 
                    
| ユーザー | 
                             pengin_2000
                         | 
                    
| 提出日時 | 2022-08-22 23:07:02 | 
| 言語 | C  (gcc 13.3.0)  | 
                    
| 結果 | 
                             
                                AC
                                 
                             
                            
                         | 
                    
| 実行時間 | 202 ms / 2,000 ms | 
| コード長 | 1,438 bytes | 
| コンパイル時間 | 371 ms | 
| コンパイル使用メモリ | 33,024 KB | 
| 実行使用メモリ | 6,820 KB | 
| 最終ジャッジ日時 | 2024-10-10 06:43:27 | 
| 合計ジャッジ時間 | 1,891 ms | 
| 
                            ジャッジサーバーID (参考情報)  | 
                        judge1 / judge4 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 3 | 
| other | AC * 27 | 
ソースコード
#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;
}
            
            
            
        
            
pengin_2000