https://www.hackerrank.com/contests/kodamanwithothers/challenges/powerful-sum
解説
Nがとても大きいので、普通に計算するんじゃないんだろうなと言うのはわかる。
1018ということは数学一本で計算できるか、logNかどちらかである。
とりあえず、対称式でググりまくると、こういうサイトが出てくる。
これによると、An = x^n + y^n
とすると、An = (x+y)An-1 - xyAn-2
である。
漸化式が作れれば、行列累乗で答えも作れる。
ll N, A, B; //--------------------------------------------------------------------------------------------------- void _main() { cin >> N >> A >> B; Vec v(3, 0); v[0] = (A + mod) % mod; v[1] = 2; v[2] = 0; Mat m(3, Vec(3, 0)); m[0][0] = (A + mod) % mod; m[0][1] = (-B + mod) % mod; m[0][2] = 0; m[1][0] = 1; m[1][1] = 0; m[1][2] = 0; m[2][0] = 1; m[2][1] = 0; m[2][2] = 1; m = fastpow(m, N - 1); v = mulMatVec(m, v); int ans = (v[0] + v[2]) % mod; cout << ans << endl; }