Submission #202851

#TimeUsernameProblemLanguageResultExecution timeMemory
202851coloredrabbitPhibonacci (kriii2_P)C++17
1 / 4
6 ms380 KiB
#include<iostream> #include<cstring> using namespace std; using ll = __int128; const int LIMIT = 126, M = 1e9 + 7; const ll MOD = (long long)M * M; struct _mt { ll m[2][2], t[2][2]; _mt() { memset(m, 0, sizeof m); memset(t, 0, sizeof t); } void E() { for (int i = 0; i < 2; i++) t[i][i] = m[i][i] = 1; } _mt operator*(const _mt& o) { _mt r; int i, j, k; for (i = 0; i < 2; i++)for (j = 0; j < 2; j++) for (k = 0; k < 2; k++) { r.m[i][j] = (r.m[i][j] + m[i][k] * o.m[k][j]) % M; r.t[i][j] = (r.t[i][j] + t[i][k] * o.t[k][j]) % MOD; } return r; } }F[LIMIT], NK, K; ll _pow(ll a, ll n) { if (n == 1) return a; ll h = _pow(a, n >> 1); return (h * h % M) * (n % 2 ? a : 1) % M; } int main() { ll n, k, A, B, i, nk, bitset_v = 1, x, y; long long tN, tK; cin >> tN >> tK; n = tN, k = tK; F[0].t[0][0] = F[0].t[0][1] = F[0].t[1][0] = 1; F[0].m[0][0] = F[0].m[0][1] = F[0].m[1][0] = 1; NK.E(); K.E(); nk = k * n; for (i = 1; i < LIMIT; i++) F[i] = F[i - 1] * F[i - 1]; for (i = 0; i < LIMIT; i++) { if ((bitset_v << i) & nk) NK = NK * F[i]; if ((bitset_v << i) & k) K = K * F[i]; } if(K.m[0][1]){ x = K.m[0][1]; y = NK.m[0][1]; A = y * _pow(x, M - 2) % M; } else { x = K.t[0][1]; y = NK.t[0][1]; A = y * _pow(x, MOD - 2) % M; } B = (NK.m[1][1] - A * K.m[1][1] % M + M) % M; cout << (long long)A << ' ' << (long long)B; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...