結果
問題 | No.2810 Have Another Go (Hard) |
ユーザー |
![]() |
提出日時 | 2024-07-13 11:36:04 |
言語 | C (gcc 13.3.0) |
結果 |
AC
|
実行時間 | 2,873 ms / 3,000 ms |
コード長 | 2,216 bytes |
コンパイル時間 | 898 ms |
コンパイル使用メモリ | 31,004 KB |
実行使用メモリ | 6,944 KB |
最終ジャッジ日時 | 2024-07-13 11:37:45 |
合計ジャッジ時間 | 97,544 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 61 |
ソースコード
#include <stdio.h>void mul_matrix (long long a[][6], long long b[][6], long long ans[][6], long long mod_num) {for (int i = 0; i < 6; i++) {for (int j = 0; j < 6; j++) {ans[i][j] = 0LL;for (int k = 0; k < 6; k++) {ans[i][j] += a[i][k]*b[k][j];ans[i][j] %= mod_num;}}}return;}void power_matrix (long long a[][6], long long b, long long ans[][6], long long mod_num) {long long wk[6][6] = {};if (b <= 0LL) {for (int i = 0; i < 6; i++) {for (int j = 0; j < 6; j++) {ans[i][j] = 0LL;}ans[i][i] = 1LL;}return;}if (b%2LL == 1LL) {power_matrix(a, b/2LL, ans, mod_num);mul_matrix(ans, ans, wk, mod_num);mul_matrix(a, wk, ans, mod_num);return;}power_matrix(a, b/2LL, wk, mod_num);mul_matrix(wk, wk, ans, mod_num);return;}int main () {long long n = 0LL;long long m = 0LL;int k = 0;int c[5000] = {};int res = 0;long long ans[5000] = {};long long mod_num = 998244353LL;long long total = 0LL;long long wk1[6][6] = {};long long wk2[6][6] = {};res = scanf("%lld", &n);res = scanf("%lld", &m);res = scanf("%d", &k);for (int i = 0; i < k; i++) {res = scanf("%d", c+i);}for (int i = 0; i < 5; i++) {wk1[i+1][i] = 1LL;}for (int i = 0; i < 6; i++) {wk1[0][i] = 1LL;}power_matrix(wk1, n*m, wk2, mod_num);for (int i = 0; i < 6; i++) {total += wk2[0][i];}total %= mod_num;for (int i = 0; i < k; i++) {long long wk3[6][6] = {};long long wk4[6][6] = {};for (int j = 0; j < 5; j++) {wk3[j+1][j+1] = 1LL;}power_matrix(wk1, n, wk2, mod_num);mul_matrix(wk2, wk3, wk4, mod_num);power_matrix(wk4, m-1LL, wk2, mod_num);mul_matrix(wk3, wk2, wk4, mod_num);power_matrix(wk1, (long long)c[i], wk2, mod_num);mul_matrix(wk4, wk2, wk3, mod_num);power_matrix(wk1, n-((long long)(c[i]+1)), wk2, mod_num);mul_matrix(wk2, wk3, wk4, mod_num);for (int j = 0; j < 6; j++) {ans[i] += wk4[j][0]*((long long)(6-j));}printf("%lld\n", (total+mod_num-ans[i]%mod_num)%mod_num);}return 0;}