题意:
给出n,求(sqrt(2.0)+sqrt(3.0))^(2*n)向下取整
给出n,求(sqrt(2.0)+sqrt(3.0))^(2*n)向下取整
mod1024的值。
分析转自:http://www.07net01.com/program/570696.html
代码实现:
/*//////////////////////////////
HDU 2256 快速矩阵幂
题意:
给出n,求(sqrt(2.0)+sqrt(3.0))^(2*n)向下取整
mod1024的值。
//////////////////////////////*/
#include <cstdio>
#include <cstring>
#include <cmath>
int n,mod=1024;
struct Matrix
{
int m[2][2];
void clear()
{
memset(m,0,sizeof(m));
}
}E, Z;
Matrix Mut(Matrix A, Matrix B)
{
Matrix ans;
for (int i = 0; i<2; i++)
for (int j = 0; j<2; j++)
{
ans.m[i][j] = 0;
for (int k = 0; k<2; k++)
{
ans.m[i][j] += ((A.m[i][k])*(B.m[k][j]));
ans.m[i][j]%=mod;
}
}
return ans;
}
Matrix Pow(Matrix A, int b)
{
Matrix t = A, ans = E;
while (b)
{
if (b % 2)
ans = Mut(ans, t);
b /= 2;
t = Mut(t, t);
}
return ans;
}
int main()
{
//freopen("in.txt", "r", stdin);
Matrix A;
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
A.m[0][0]=1;A.m[0][1]=0;
A.m[1][0]=0;A.m[1][1]=1;
E.m[0][0]=5;E.m[0][1]=12;
E.m[1][0]=2;E.m[1][1]=5;
Matrix ans=Pow(E,n-1);
int s=int(2*ans.m[0][0]-1)%1024;
printf("%d\n",s);
}
return 0;
}