結果
問題 | No.147 試験監督(2) |
ユーザー | bal4u |
提出日時 | 2019-04-11 20:13:06 |
言語 | C (gcc 12.3.0) |
結果 |
TLE
|
実行時間 | - |
コード長 | 2,071 bytes |
コンパイル時間 | 401 ms |
コンパイル使用メモリ | 31,744 KB |
実行使用メモリ | 12,032 KB |
最終ジャッジ日時 | 2024-07-19 07:31:16 |
合計ジャッジ時間 | 7,137 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | TLE | - |
testcase_01 | -- | - |
testcase_02 | -- | - |
testcase_03 | -- | - |
コンパイルメッセージ
main.c: In function 'in': main.c:9:14: warning: implicit declaration of function 'getchar_unlocked' [-Wimplicit-function-declaration] 9 | #define gc() getchar_unlocked() | ^~~~~~~~~~~~~~~~ main.c:15:17: note: in expansion of macro 'gc' 15 | int c = gc(); | ^~
ソースコード
// yukicoder: No.147 試験監督(2) // 2019.4.11 bal4u #include <stdio.h> #include <stdlib.h> //// 高速入力 #if 1 #define gc() getchar_unlocked() #else #define gc() getchar() #endif long long in() { int c = gc(); long long n = 0; do n = 10 * n + (c & 0xf), c = gc(); while (c >= '0'); return n; } int ins(char *s) { char c, *p = s; do c = gc(), *s-- = c & 0xf; while (c > ' '); return p - ++s; } #define MOD 1000000007 //// fibonacci数の高速計算 void multiply(int F[2][2], int M[2][2]) { int x = ((long long)F[0][0] * M[0][0] + (long long)F[0][1] * M[1][0]) % MOD; int y = ((long long)F[0][0] * M[0][1] + (long long)F[0][1] * M[1][1]) % MOD; int z = ((long long)F[1][0] * M[0][0] + (long long)F[1][1] * M[1][0]) % MOD; int w = ((long long)F[1][0] * M[0][1] + (long long)F[1][1] * M[1][1]) % MOD; F[0][0] = x; F[0][1] = y; F[1][0] = z; F[1][1] = w; } void power(int F[2][2], long long n) { int M[2][2] = { {1,1},{1,0} }; if (n == 0 || n == 1) return; power(F, n >> 1); multiply(F, F); if (n & 1) multiply(F, M); } int fib(long long n) { int F[2][2] = { {1,1},{1,0} }; if (n == 0) return 0; power(F, n - 1); return F[0][0]; } //// 10進数を2進数に変換 int dec2bin(char *bin, int dlen, char *dec) { int i; int d, r; int blen; int non_zero; blen = 0; do { r = 0; non_zero = 0; for (i = dlen - 1; i >= 0; i--) { d = dec[i]; dec[i] = d >> 1; if (r > 0) dec[i] += 5; if (dec[i] > 0) non_zero = 1; r = d & 1; } bin[blen++] = r; } while (non_zero); return blen; } // calc b^p (mod m) int big_mod(int b, int len, char *p) { long long s = 1; long long d; d = b % MOD; while (len > 0) { if (*p & 1) s = (s * d) % MOD; p++, len--; d = (d * d) % MOD; } return (int)s; } char d[210]; int wd; // 10進数 char b[600]; int wb; // 2進数 int main() { int n, c; long long ans; n = (int)in(); ans = 1; while (n--) { c = fib(in() + 2); wd = ins(d+205); wb = dec2bin(b, wd, 206+d-wd); ans = (ans * big_mod(c, wb, b)) % MOD; } printf("%d\n", (int)ans); return 0; }