最近做网赛看到一道类似的题,无法下手,就找到一道裸题来做。这题求的是5+2根号6的n次方。
解法是矩阵快速幂。因为,不管n等于几,得数总可以表示为an+bn*根号6(a1=5,b1=2),这样就可以构造矩阵来算。算出来an和bn以后,计算(an+bn*根号6)mod1024,结果发现连样例都过不了,这是因为根号6不是整数,我们平时习以为常的等式失效了。正确的做法是推出整数部分=2*an-1。。。
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int mod = 1024;
struct mat{
ll v[4][4];
mat(){
memset(v,0,sizeof(v));
}
};
mat mat_mul(mat a,mat b,int siz){
mat re;
for(int i=0;i<siz;i++){
for(int j=0;j<siz;j++){
for(int k=0;k<siz;k++){
re.v[i][j]+=a.v[i][k]*b.v[k][j];
re.v[i][j]%=mod;
}
}
}
return re;
}
mat mat_pow(mat m,ll n,int siz){
mat re;
mat tmp=m;
for(int i=0;i<siz;i++){
re.v[i][i]=1;
}
while(n){
if(n&1){
re=mat_mul(re,tmp,siz);
}
tmp=mat_mul(tmp,tmp,siz);
n>>=1;
}
return re;
}
int main(){
int t;
cin>>t;
while(t--){
int n;
cin>>n;
mat m;
m.v[0][0] = 5;
m.v[1][0] = 12;
m.v[0][1] = 2;
m.v[1][1] = 5;
mat a;
a.v[0][0] = 5; a.v[0][1] = 2;
mat ans = mat_pow(m,n-1,2);
ans = mat_mul(a,ans,2);
cout<<(ans.v[0][0]*2-1+mod)%mod<<endl;
}
return 0;
}