Problem of Precision
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1565 Accepted Submission(s): 951
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
代码如下:
#include <iostream>
#include <cstring>
#include <queue>
#include <algorithm>
#include <stdio.h>
#include <cmath>
#include <string>
#include <stack>
typedef long long ll;
const int MOD=1024;
const int N =20;
const int MAXN=2;
using namespace std;
struct Matrix{
ll arr[N][N];
void init()
{
memset(arr,0,sizeof(arr));
for(int i=0;i<MAXN;i++)
arr[i][i]=1;//初始化
}
void iinit()
{
memset(arr,0,sizeof(arr));
arr[0][0]=arr[1][1]=5;
arr[0][1]=12;
arr[1][0]=2;
}
}A;
Matrix mul(Matrix X,Matrix Y)// 矩阵乘法
{
Matrix ans;
for(int i=0;i<MAXN;i++)
for(int j=0;j<MAXN;j++){
ans.arr[i][j]=0;
for(int k=0;k<MAXN;k++){
ans.arr[i][j]+=X.arr[i][k]*Y.arr[k][j];
ans.arr[i][j]%=MOD;
}
}
return ans;
}
Matrix Q_pow(Matrix B,int n)// 矩阵快速幂
{
Matrix ans;
ans.init();
while(n)
{
if(n&1)
ans=mul(ans,B);
n>>=1;
B=mul(B,B);
}
return ans;
}
Matrix Add(Matrix a,Matrix b) //(a+b)%mod 矩阵加法
{
int i,j,k;
Matrix ans;
for(i=0;i<MAXN;i++)
for(j=0;j<MAXN;j++)
{
ans.arr[i][j]=a.arr[i][j]+b.arr[i][j];
ans.arr[i][j]%=MOD;
}
return ans;
}
Matrix Sum(Matrix a,int n)// 矩阵和
{
int m;
Matrix ans,pre;
if(n==1) return ans;
m=n/2;
pre=Sum(a,m);
ans=Add(pre,mul(pre,Q_pow(a,m)));
if(n&1)
ans=Add(ans,Q_pow(a,n));
return ans;
}
int main()
{
int T;
cin>>T;
int n;
while(T--)
{
scanf("%d",&n);
Matrix ans;
ans.iinit();
if(n==1)
{
printf("9\n");
continue;
}
ans=Q_pow(ans,n-1);
ll res=0;
//cout<<ans.arr[0][0]<<" "<<ans.arr[0][1]<<" "<<endl;
res=(ans.arr[0][0]*5+ans.arr[0][1]*2)%MOD;
printf("%lld\n",(2*res-1)%MOD);
}
return 0;
}