提出 #30091431
ソースコード 拡げる
Copy
Copy
- #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;
- }
#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;
}
提出情報
ジャッジ結果
セット名 |
Sample |
k_2 |
k_3 |
k_4 |
All |
得点 / 配点 |
0 / 0 |
0 / 2 |
0 / 30 |
0 / 400 |
0 / 568 |
結果 |
|
|
|
|
|
セット名 |
テストケース |
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 |