P5175 数列(矩阵快速幂)
P5175 數列
anb=(x×an?1+y×an?2)2x2×an?12+y2×an?22+2×x×y×an?1an?2x2×an?12+y2×an?22+2×x×y×an?2(x×an?2+y×an?3)x2×an?12+y2×an?22+2×x×y×(x×an?22+y×an?2×an?3)a_n ^ b = \left(x \times a_{n - 1} + y \times a_{n - 2}\right) ^ 2\\ x ^ 2 \times a_{n - 1} ^ 2 + y ^ 2 \times a_{n - 2} ^ 2 + 2 \times x \times y \times a_{n - 1} a_{n - 2}\\ x ^ 2 \times a_{n - 1} ^ 2 + y ^ 2 \times a_{n - 2} ^ 2 + 2 \times x \times y \times a_{n - 2} \left(x \times a_{n - 2} + y \times a_{n - 3} \right)\\ x ^ 2 \times a_{n - 1} ^ 2 + y ^ 2 \times a_{n - 2} ^ 2 + 2 \times x \times y \times \left(x \times a_{n - 2} ^ 2 + y \times a_{n - 2} \times a_{n - 3} \right)\\ anb?=(x×an?1?+y×an?2?)2x2×an?12?+y2×an?22?+2×x×y×an?1?an?2?x2×an?12?+y2×an?22?+2×x×y×an?2?(x×an?2?+y×an?3?)x2×an?12?+y2×an?22?+2×x×y×(x×an?22?+y×an?2?×an?3?)
Sn+1=Sn+an+12S_{n + 1} = S_{n} + a_{n + 1} ^ 2Sn+1?=Sn?+an+12?,
an+12=x2×an+y2×an?1+2×x×y×an×an?1a_{n + 1} ^ 2 = x ^ 2 \times a_n + y ^ 2 \times a_{n - 1} + 2 \times x \times y \times a_n \times a_{n - 1}an+12?=x2×an?+y2×an?1?+2×x×y×an?×an?1?,
an+1an=x×an2+y×an×an?1a_{n + 1} a_n = x \times a_n ^ 2 + y \times a_{n} \times a_{n - 1}an+1?an?=x×an2?+y×an?×an?1?,
[Snan2an?12anan?1]\begin{bmatrix}S_n & a_n ^ 2 & a_{n - 1} ^ 2 & a_n a_{n - 1}\end{bmatrix}[Sn??an2??an?12??an?an?1??] ×\times× [1000x2x21xy2y2002×x×y2×x×y0y]\begin{bmatrix} 1 & 0 & 0 & 0\\ x ^ 2 & x ^ 2 & 1 & x\\ y ^ 2 & y ^ 2 & 0 & 0\\ 2 \times x \times y & 2 \times x \times y & 0 & y\end{bmatrix}?????1x2y22×x×y?0x2y22×x×y?0100?0x0y??????
#include <bits/stdc++.h>using namespace std;const int mod = 1e9 + 7;inline int add(int x, int y) {return x + y < mod ? x + y : x + y - mod; }struct Matrix {int a[4][4]; };Matrix operator * (Matrix a, Matrix b) {Matrix ans;for (int i = 0; i < 4; i++) {for (int j = 0; j < 4; j++) {ans.a[i][j] = 0;for (int k = 0; k < 4; k++) {ans.a[i][j] = add(ans.a[i][j], 1ll * a.a[i][k] * b.a[k][j] % mod);}}}return ans; }int main() { // freopen("in.txt", "r", stdin);// freopen("out.txt", "w", stdout);int T;scanf("%d", &T);while (T--) {long long n;int a1, a2, x, y;scanf("%lld %d %d %d %d", &n, &a1, &a2, &x, &y);if (n == 1) {printf("%d\n", 1ll * a1 * a1 % mod);}else if (n == 2) {printf("%d\n", add(1ll * a1 * a1 % mod, 1ll * a2 * a2 % mod));}else {Matrix ans = {add(1ll * a1 * a1 % mod, 1ll * a2 * a2 % mod), int(1ll * a2 * a2 % mod), int(1ll * a1 * a1 % mod), int(1ll * a1 * a2 % mod),0, 0, 0, 0,0, 0, 0, 0,0, 0, 0, 0,};Matrix a = {1, 0, 0, 0,int(1ll * x * x % mod), int(1ll * x * x % mod), 1, x,int(1ll * y * y % mod), int(1ll * y * y % mod), 0, 0,int(2ll * x * y % mod), int(2ll * x * y % mod), 0, y};n -= 2;while (n) {if (n & 1) {ans = ans * a;}a = a * a;n >>= 1;}printf("%d\n", ans.a[0][0]);}}return 0; }總結
以上是生活随笔為你收集整理的P5175 数列(矩阵快速幂)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 半月板损伤肌肉贴贴法
- 下一篇: 脑花的功效与作用、禁忌和食用方法