题意:给一堆公式,求 ⌊a[n]‾‾‾‾√⌋ 的值。
官方题解的公式推的实在是没什么道理,但是这个xjb乱猜我真的是一口老血喷出来。。。
令 f(n)=⌊a[n]‾‾‾‾√⌋ ,则 f(n)=4f(n−1)+17f(n−2)−12f(n−3)
没错,就是 h(n) 的那个递推……
然后就用矩阵快速幂瞎搞搞就好了,没什么可说的。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1000000007;
struct Matrix{
ll a[5][5];
void init(){
for (int i=1;i<=3;i++){
for (int j=1;j<=3;j++){
a[i][j]=0;
}
}
}
Matrix operator * (const Matrix &b) const{
Matrix tmp;
tmp.init();
for (int i=1;i<=3;i++){
for (int j=1;j<=3;j++){
for (int k=1;k<=3;k++){
tmp.a[i][j]+=(a[i][k]*b.a[k][j]%mod+mod)%mod;
}
}
}
return tmp;
}
};
Matrix mat_pow(Matrix mat,ll n){
Matrix ans;
ans.init();
ans.a[1][1]=ans.a[2][2]=ans.a[3][3]=1;
while (n){
if (n&1) ans=mat*ans;
mat=mat*mat;
n>>=1;
}
return ans;
}
int main(){
int T;
scanf("%d",&T);
while (T--){
ll n;
scanf("%lld",&n);
if (n==2) printf("31\n");
else if (n==3) printf("197\n");
else if (n==4) printf("1255\n");
else{
Matrix mat;
mat.init();
mat.a[1][1]=4,mat.a[1][2]=17,mat.a[1][3]=-12;
mat.a[2][1]=1,mat.a[3][2]=1;
mat=mat_pow(mat,n-4);
ll ans=((mat.a[1][1]*1255%mod+mat.a[1][2]*197%mod+mod)%mod+31*mat.a[1][3]%mod+mod)%mod;
ans%=mod;
printf("%lld\n",ans);
}
}
}
本文介绍了一种使用矩阵快速幂解决特定递推数列问题的方法,并提供了完整的C++代码实现。该方法适用于求解形如f(n)=4f(n-1)+17f(n-2)-12f(n-3)的递推公式。
4591

被折叠的 条评论
为什么被折叠?



