提出 #30091431


ソースコード 拡げる

Copy
Copy
  1. #include <stdio.h>
  2. #include <inttypes.h>
  3. #include <string.h>
  4.  
  5. #define MOD_BY 1000000007
  6.  
  7. int add(int a, int b) {
  8. return a + b - MOD_BY * (a + b >= MOD_BY);
  9. }
  10.  
  11. int mul(int a, int b) {
  12. return (int)((long long)a * b % MOD_BY);
  13. }
  14.  
  15. int K;
  16. uint64_t N;
  17.  
  18. int mat[16][16];
  19.  
  20. char status[2][4];
  21. void asumikana(int pos) {
  22. if(pos >= K) {
  23. int init = 0, result = 0;
  24. int i;
  25. for (i = 0; i < K; i++) {
  26. if (status[0][i] == 2) init |= 1 << i;
  27. if (status[1][i]) result |= 1 << i;
  28. }
  29. mat[init][result]++;
  30. } else if (status[0][pos]) {
  31. asumikana(pos + 1);
  32. } else {
  33. status[0][pos] = 1;
  34. status[1][pos] = 1;
  35. asumikana(pos + 1);
  36. status[1][pos] = 0;
  37. if (pos + 1 < K && !status[0][pos + 1]) {
  38. status[0][pos + 1] = 1;
  39. asumikana(pos + 2);
  40. status[0][pos + 1] = 0;
  41. }
  42. status[0][pos] = 0;
  43. }
  44. }
  45.  
  46. void matmul(int res[16][16], int a[16][16], int b[16][16], int size) {
  47. static int buf[16][16];
  48. int i, j, k;
  49. memset(buf, 0, sizeof(buf));
  50. for (i = 0; i < size; i++) {
  51. for (k = 0; k < size; k++) {
  52. for (j = 0; j < size; j++) {
  53. buf[i][j] = add(buf[i][j], mul(a[i][k], b[k][j]));
  54. }
  55. }
  56. }
  57. memcpy(res, buf, sizeof(buf));
  58. }
  59.  
  60. void matpow(int res[16][16], int a[16][16], int b, int size) {
  61. static int abuf[16][16];
  62. static int rbuf[16][16];
  63. int i;
  64. memcpy(abuf, a, sizeof(abuf));
  65. memset(rbuf, 0, sizeof(rbuf));
  66. for (i = 0; i < size; i++) rbuf[i][i] = 1;
  67. while (b > 0) {
  68. if (b & 1) matmul(rbuf, rbuf, abuf, size);
  69. if (b > 1) matmul(abuf, abuf, abuf, size);
  70. b >>= 1;
  71. }
  72. memcpy(res, rbuf, sizeof(rbuf));
  73. }
  74.  
  75. int kitamuraeri[16][16];
  76.  
  77. int main(void) {
  78. int i, j;
  79. if (scanf("%d%" SCNu64, &K, &N) != 2) return 1;
  80. for (i = 0; i < (1 << K); i++) {
  81. for (j = 0; j < K; j++) {
  82. status[0][j] = ((i >> j) & 1) * 2;
  83. }
  84. asumikana(0);
  85. }
  86. matpow(kitamuraeri, mat, N, 1 << K);
  87. printf("%d\n", kitamuraeri[0][0]);
  88. return 0;
  89. }
#include <stdio.h>
#include <inttypes.h>
#include <string.h>

#define MOD_BY 1000000007

int add(int a, int b) {
	return a + b - MOD_BY * (a + b >= MOD_BY);
}

int mul(int a, int b) {
	return (int)((long long)a * b % MOD_BY);
}

int K;
uint64_t N;

int mat[16][16];

char status[2][4];
void asumikana(int pos) {
	if(pos >= K) {
		int init = 0, result = 0;
		int i;
		for (i = 0; i < K; i++) {
			if (status[0][i] == 2) init |= 1 << i;
			if (status[1][i]) result |= 1 << i;
		}
		mat[init][result]++;
	} else if (status[0][pos]) {
		asumikana(pos + 1);
	} else {
		status[0][pos] = 1;
		status[1][pos] = 1;
		asumikana(pos + 1);
		status[1][pos] = 0;
		if (pos + 1 < K && !status[0][pos + 1]) {
			status[0][pos + 1] = 1;
			asumikana(pos + 2);
			status[0][pos + 1] = 0;
		}
		status[0][pos] = 0;
	}
}

void matmul(int res[16][16], int a[16][16], int b[16][16], int size) {
	static int buf[16][16];
	int i, j, k;
	memset(buf, 0, sizeof(buf));
	for (i = 0; i < size; i++) {
		for (k = 0; k < size; k++) {
			for (j = 0; j < size; j++) {
				buf[i][j] = add(buf[i][j], mul(a[i][k], b[k][j]));
			}
		}
	}
	memcpy(res, buf, sizeof(buf));
}

void matpow(int res[16][16], int a[16][16], int b, int size) {
	static int abuf[16][16];
	static int rbuf[16][16];
	int i;
	memcpy(abuf, a, sizeof(abuf));
	memset(rbuf, 0, sizeof(rbuf));
	for (i = 0; i < size; i++) rbuf[i][i] = 1;
	while (b > 0) {
		if (b & 1) matmul(rbuf, rbuf, abuf, size);
		if (b > 1) matmul(abuf, abuf, abuf, size);
		b >>= 1;
	}
	memcpy(res, rbuf, sizeof(rbuf));
}

int kitamuraeri[16][16];

int main(void) {
	int i, j;
	if (scanf("%d%" SCNu64, &K, &N) != 2) return 1;
	for (i = 0; i < (1 << K); i++) {
		for (j = 0; j < K; j++) {
			status[0][j] = ((i >> j) & 1) * 2;
		}
		asumikana(0);
	}
	matpow(kitamuraeri, mat, N, 1 << K);
	printf("%d\n", kitamuraeri[0][0]);
	return 0;
}

提出情報

提出日時
問題 057 - Domino Tiling
ユーザ mikecat
言語 C (GCC 9.2.1)
得点 0
コード長 1930 Byte
結果 WA
実行時間 6 ms
メモリ 1676 KB

ジャッジ結果

セット名 Sample k_2 k_3 k_4 All
得点 / 配点 0 / 0 0 / 2 0 / 30 0 / 400 0 / 568
結果
AC × 3
AC × 2
WA × 19
AC × 5
WA × 16
AC × 2
WA × 19
AC × 9
WA × 54
セット名 テストケース
Sample sample_k_2.txt, sample_k_3.txt, sample_k_4.txt
k_2 k_2_01.txt, k_2_02.txt, k_2_03.txt, k_2_04.txt, k_2_05.txt, k_2_06.txt, k_2_07.txt, k_2_08.txt, k_2_09.txt, k_2_10.txt, k_2_11.txt, k_2_12.txt, k_2_13.txt, k_2_14.txt, k_2_15.txt, k_2_16.txt, k_2_17.txt, k_2_18.txt, k_2_19.txt, k_2_20.txt, sample_k_2.txt
k_3 k_3_01.txt, k_3_02.txt, k_3_03.txt, k_3_04.txt, k_3_05.txt, k_3_06.txt, k_3_07.txt, k_3_08.txt, k_3_09.txt, k_3_10.txt, k_3_11.txt, k_3_12.txt, k_3_13.txt, k_3_14.txt, k_3_15.txt, k_3_16.txt, k_3_17.txt, k_3_18.txt, k_3_19.txt, k_3_20.txt, sample_k_3.txt
k_4 k_4_01.txt, k_4_02.txt, k_4_03.txt, k_4_04.txt, k_4_05.txt, k_4_06.txt, k_4_07.txt, k_4_08.txt, k_4_09.txt, k_4_10.txt, k_4_11.txt, k_4_12.txt, k_4_13.txt, k_4_14.txt, k_4_15.txt, k_4_16.txt, k_4_17.txt, k_4_18.txt, k_4_19.txt, k_4_20.txt, sample_k_4.txt
All k_2_01.txt, k_2_02.txt, k_2_03.txt, k_2_04.txt, k_2_05.txt, k_2_06.txt, k_2_07.txt, k_2_08.txt, k_2_09.txt, k_2_10.txt, k_2_11.txt, k_2_12.txt, k_2_13.txt, k_2_14.txt, k_2_15.txt, k_2_16.txt, k_2_17.txt, k_2_18.txt, k_2_19.txt, k_2_20.txt, k_3_01.txt, k_3_02.txt, k_3_03.txt, k_3_04.txt, k_3_05.txt, k_3_06.txt, k_3_07.txt, k_3_08.txt, k_3_09.txt, k_3_10.txt, k_3_11.txt, k_3_12.txt, k_3_13.txt, k_3_14.txt, k_3_15.txt, k_3_16.txt, k_3_17.txt, k_3_18.txt, k_3_19.txt, k_3_20.txt, k_4_01.txt, k_4_02.txt, k_4_03.txt, k_4_04.txt, k_4_05.txt, k_4_06.txt, k_4_07.txt, k_4_08.txt, k_4_09.txt, k_4_10.txt, k_4_11.txt, k_4_12.txt, k_4_13.txt, k_4_14.txt, k_4_15.txt, k_4_16.txt, k_4_17.txt, k_4_18.txt, k_4_19.txt, k_4_20.txt, sample_k_2.txt, sample_k_3.txt, sample_k_4.txt
ケース名 結果 実行時間 メモリ
k_2_01.txt AC 6 ms 1668 KB
k_2_02.txt WA 1 ms 1608 KB
k_2_03.txt WA 1 ms 1672 KB
k_2_04.txt WA 1 ms 1604 KB
k_2_05.txt WA 2 ms 1612 KB
k_2_06.txt WA 1 ms 1672 KB
k_2_07.txt WA 1 ms 1608 KB
k_2_08.txt WA 2 ms 1608 KB
k_2_09.txt WA 1 ms 1604 KB
k_2_10.txt WA 1 ms 1592 KB
k_2_11.txt WA 1 ms 1604 KB
k_2_12.txt WA 1 ms 1672 KB
k_2_13.txt WA 1 ms 1612 KB
k_2_14.txt WA 2 ms 1592 KB
k_2_15.txt WA 1 ms 1592 KB
k_2_16.txt WA 1 ms 1612 KB
k_2_17.txt WA 3 ms 1592 KB
k_2_18.txt WA 1 ms 1676 KB
k_2_19.txt WA 2 ms 1608 KB
k_2_20.txt WA 1 ms 1668 KB
k_3_01.txt AC 2 ms 1612 KB
k_3_02.txt AC 1 ms 1592 KB
k_3_03.txt AC 1 ms 1612 KB
k_3_04.txt WA 1 ms 1592 KB
k_3_05.txt WA 1 ms 1588 KB
k_3_06.txt WA 1 ms 1612 KB
k_3_07.txt WA 2 ms 1608 KB
k_3_08.txt WA 1 ms 1588 KB
k_3_09.txt WA 1 ms 1608 KB
k_3_10.txt WA 3 ms 1616 KB
k_3_11.txt WA 1 ms 1600 KB
k_3_12.txt WA 1 ms 1672 KB
k_3_13.txt WA 1 ms 1668 KB
k_3_14.txt WA 2 ms 1672 KB
k_3_15.txt WA 1 ms 1608 KB
k_3_16.txt WA 1 ms 1668 KB
k_3_17.txt WA 1 ms 1612 KB
k_3_18.txt WA 1 ms 1604 KB
k_3_19.txt AC 3 ms 1604 KB
k_3_20.txt WA 1 ms 1608 KB
k_4_01.txt AC 2 ms 1592 KB
k_4_02.txt WA 2 ms 1672 KB
k_4_03.txt WA 1 ms 1612 KB
k_4_04.txt WA 1 ms 1676 KB
k_4_05.txt WA 2 ms 1592 KB
k_4_06.txt WA 1 ms 1588 KB
k_4_07.txt WA 3 ms 1604 KB
k_4_08.txt WA 2 ms 1608 KB
k_4_09.txt WA 2 ms 1672 KB
k_4_10.txt WA 2 ms 1612 KB
k_4_11.txt WA 2 ms 1668 KB
k_4_12.txt WA 2 ms 1608 KB
k_4_13.txt WA 1 ms 1668 KB
k_4_14.txt WA 2 ms 1592 KB
k_4_15.txt WA 2 ms 1600 KB
k_4_16.txt WA 1 ms 1596 KB
k_4_17.txt WA 1 ms 1668 KB
k_4_18.txt WA 2 ms 1596 KB
k_4_19.txt WA 2 ms 1592 KB
k_4_20.txt WA 2 ms 1608 KB
sample_k_2.txt AC 2 ms 1596 KB
sample_k_3.txt AC 1 ms 1588 KB
sample_k_4.txt AC 1 ms 1592 KB


2022-03-12 (土)
23:12:03 +00:00