题面为(sqrt(2)+sqrt(3))^2n,化简后为(5+2sqrt(6))^n
由二项式定理,(5+2sqrt(6))^n=Xn+Ynsqrt(6)
设F(n)=Xn+Ynsqrt(6),则F(n)=(5+2sqrt(6))×F(n-1)=(5+2sqrt(6))×(Xn-1+Yn-1sqrt(6))=(5Xn-1+12Yn-1)+(2Xn-1+5Yn-1)sqrt(6)
至此,递推式构造完成可由递推式和矩阵乘法性质构造出矩阵:(Xn-1,Yn-1)× (5,2;12,5)(①) =(Xn,Yn)
再确定初始值X1=5,Y1=2,即可得(5+2sqrt(6))^n=(5,2)*①^(n-1)可算出式子的值。
但此时因为过程中涉及到小数求模,精度会出问题,所以继续进行化简
由(5+2sqrt(6))^n的共轭式(5-2sqrt(6))^n得此两式之和等于2Xn,
且由0<5-2sqrt(6)<1可得原式结果为(2Xn)-1,此时就可以利用矩阵快速幂求模求出结果
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <string>
#include <vector>
#include <stack>
#include <set>
#include <map>
using namespace std;
const int MAXN = 2;
const int mod = 1024;
struct Matrix
{
__int64 a[MAXN][MAXN];
int r;//行数
int c;//列数
};
void print(Matrix mat)
{
for(int i=0;i<mat.r;i++)
{
for(int j=0;j<mat.c;j++)
{
if(j) cout<<" ";
cout<<mat.a[i][j];
}
cout<<endl;
}
cout<<endl;
}
void init(Matrix &mat, __int64 n)
{
for (int i = 0;i < mat.r;i++)
{
for (int j = 0;j < mat.c;j++)
{
mat.a[i][j] = n;
}
}
}
Matrix mul(Matrix mat1, Matrix mat2)
{
Matrix res;
res.c = mat2.c;
res.r = mat1.r;
init(res, 0);
for (int i = 0;i < mat1.r;i++)
{
for (int j = 0;j < mat2.c;j++)
{
for (int k = 0;k < mat1.c;k++)
{
res.a[i][j] += mat1.a[i][k] * mat2.a[k][j];
res.a[i][j] %= mod;
}
}
}
return res;
}
Matrix fmp(__int64 n)
{
Matrix ans;
ans.c = 2;
ans.r = 2;
ans.a[0][0] = 5;
ans.a[0][1] = 2;
ans.a[1][0] = 12;
ans.a[1][1] = 5;
Matrix base = ans;
init(ans,0);
ans.a[0][0]=ans.a[1][1]=1;
while (n)
{
if (n & 1) ans = mul(ans, base);
base = mul(base, base);
n >>= 1;
}
return ans;
}
int main()
{
int t;
cin>>t;
while(t--)
{
__int64 n;
cin>>n;
Matrix ans=fmp(n-1);
cout<<((2*(5*ans.a[0][0]+2*ans.a[1][0])-1)%mod)<<endl;
}
return 0;
}