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−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)
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+1an=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}[Snan2an−12anan−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×y0x2y22×x×y01000x0y⎦⎥⎥⎤
#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;
}