题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2256
Problem Description
Input
The first line of input gives the number of cases, T. T test cases follow, each on a separate line. Each test case contains one positive integer n. (1 <= n <= 10^9)
Output
For each input case, you should output the answer in one line.
Sample Input
3 1 2 5
Sample Output
9 97 841
Source
PS:
因为:(√(2)+√(3))^2n = (5+2*√(6))^n;
设An = (5 + 2√6)n,Bn = (5 - 2√6)n
Sn = An + Bn;
显然Sn是正整数,且Bn是小于1的
所以答案就是Sn - 1!
(5 + 2√6) + (5 - 2√6) = 10;
Sn* [(5 + 2√6) + (5 - 2√6)]
= ((5 + 2√6)n + (5 - 2√6)n) * [(5 + 2√6) + (5 - 2√6)]
= (5 + 2√6)^(n+1) + (5 - 2√6)^(n+1) + (5 + 2√6)^(n-1) + (5 - 2√6)^(n-1)
∴10 * Sn = Sn+1 + Sn-1
Sn+1 = 10 * Sn - Sn-1
Sn = 10*Sn-1 - Sn-2;
到这里我们就可以通过构造矩阵来解决了!
| Sn | |10 -1| | Sn-1|
| Sn-1| = |1 0 | * | Sn-2|
贴一发其他构造:http://www.acmerblog.com/hdu-2256-problem-of-precision-3486.html
代码如下:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define LL long long
struct Matrix
{
LL m[4][4];
} I,A,B,T;
LL mod = 1024;
LL n;
int ssize = 3;
Matrix Mul(Matrix a,Matrix b)
{
int i, j, k;
Matrix c;
for(i = 1; i <= ssize; i++)
{
for(j = 1; j <= ssize; j++)
{
c.m[i][j]=0;
for(k = 1; k <= ssize; k++)
{
c.m[i][j]+=(a.m[i][k]*b.m[k][j]);
c.m[i][j]%=mod;
}
}
}
return c;
}
Matrix quickpagow(LL n)
{
Matrix m = A, b = I;
while(n > 0)
{
if(n & 1)
b = Mul(b,m);
n = n >> 1;
m = Mul(m,m);
}
return b;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%lld",&n);
memset(I.m,0,sizeof(I.m));
memset(A.m,0,sizeof(A.m));
memset(B.m,0,sizeof(B.m));
for(int i = 1; i <= ssize; i++)
{
//单位矩阵
I.m[i][i]=1;
}
A.m[1][1] = 10%mod;//初始化等比矩阵
A.m[1][2] = -1;
A.m[2][1] = 1;
A.m[2][2] = 0;
B.m[1][1] = 10%mod;
B.m[2][1] = 2%mod;
T = quickpagow(n-1);
T = Mul(T,B);
printf("%lld\n",(T.m[1][1]+mod-1)%mod);
}
return 0;
}
/*
99
1
2
5
444444
4444444
123456789
*/