hdu2256 Problem of Precision
题意:
思路:
涉及到double的精度问题,推导过程看下图
代码:
/**************************************************************
Problem: HDU_2256
User: soundwave
Language: C++
Result: Accepted
Time: 15ms
Memory: 1580KB
****************************************************************/
//#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <iostream>
#include <stdio.h>
#include <vector>
/*
这就是数学问题呀,这就是数学呀,奇妙的矩阵……
an 5 12 a(n-1)
bn = 2 5 * b(n-1)
an 5 12 ^n-1 a(1)
bn = 2 5 * b(1)
2an-1;
*/
using namespace std;
typedef vector<int>Vint;
typedef vector<Vint>VVint;
typedef __int64 LL;
const int MOD = 1024;
//矩阵乘法
VVint calc(VVint &A, VVint &B){
VVint C(A.size(), Vint(A.size()));
for(int i=0; i<A.size(); i++)
for(int j=0; j<B[0].size(); j++)
for(int k=0; k<B.size(); k++)
C[i][j] = (C[i][j] + (A[i][k]*B[k][j])%MOD) % MOD;
return C;
}
//二分快速幂
VVint my_pow(VVint &A, LL c){
VVint B(A.size(), Vint(A.size()));
for(int i=0; i<A.size(); i++)
B[i][i] = 1;
//if(c==1) return A;
while(c>0){
if(c&1) B = calc(B,A);
A = calc(A,A);
c>>=1;
}
return B;
}
int main(){
int t;
LL n;
scanf("%d", &t);
while(t-->0){
scanf("%I64d", &n);
VVint A(2, Vint(2));
A[0][0]=5, A[0][1]=12;
A[1][0]=2, A[1][1]=5;
A = my_pow(A,n-1);
LL re = 0;
re = ((A[0][0]*5)%MOD + (A[0][1]*2)%MOD) % MOD;
printf("%I64d\n", (2LL*re-1)%MOD);
}
return 0;
}
/*
10
1
2
3
4
5
6
7
8
9
10
----
9
97
969
385
841
865
649
513
393
353
*/