题目链接
打表可以发现ans[n]是完全平方数,令f[n]=sqrt(ans[n])
可以求得 f]n]=3 * f[n-1] - 3 * f[n-2] + f[n-3] + 1;
所以可以用矩阵快速幂求得,答案爆ll,还得套高精度模板,如果高精度每一位都存个位数还是会超时,所以还得压位。
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
typedef long long ll;
const int mod=1e8;//压8位,mod=1e8
int T;
ll n,m;
void del(vector<int> &C)//清前导0
{
while (C.size() > 1 && C.back() == 0) C.pop_back();
}
vector<int> addd(vector<int> A, vector<int> B)//高精度加法
{
if (A.size() < B.size()) return addd(B, A);
vector<int> C;
int t=0;
for (int i = 0; i < A.size(); i ++ )
{
t += A[i];
if (i < B.size()) t += B[i];
C.push_back(t % mod);
t /= mod;
}
if (t) C.push_back(t);
return C;
}
vector<int> mul(vector<int> A, int b)// C = A * b, 高精度乘低精度
{
vector<int> C;
ll t = 0;
for (int i = 0; i < A.size() || t; i ++ )
{
if (i < A.size()) t += 1ll*A[i] * b;
C.push_back(t % mod);
t/=mod;
}
return C;
}
bool check(vector<int> &a,vector<int> &b)//比大小
{
del(a);del(b);
if(a.size()>b.size())