题目链接
分析
这是一个有通项公式的数列。设 an=p∗an−1+q∗an−2, a n = p ∗ a n − 1 + q ∗ a n − 2 ,
an=(b+d√2)n+(b−d√2)n
a
n
=
(
b
+
d
2
)
n
+
(
b
−
d
2
)
n
由特征方程可知,
p=b,q=d−b24
p
=
b
,
q
=
d
−
b
2
4
关于特征方程的详细说明,请看这里。
代码
(要注意爆精度的问题,连乘法都要写函数实现)
#include <bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;
typedef vector<ll> vec;
typedef vector<vec>mat;
#define mod 7528443412579576937
ll mul(ll a,ll b)
{
if(a>b) swap(a,b);
if(b==0) return 0;
ll ans=0;
while(b)
{
if(b&1) ans=(ans+a)%mod;
a=(a+a)%mod;
b>>=1;
}
return ans;
}
mat mul(mat &A,mat &B)
{
mat C(A.size(),vec(B[0].size()));
for(int i=0;i<A.size();++i){
for(int k=0;k<B.size();++k){
for(int j=0;j<B[0].size();++j)
C[i][j]=(C[i][j]+mul(A[i][k]%mod,B[k][j]%mod))%mod;
}
}
return C;
}
mat pow(mat A,ll n)
{
mat B(A.size(),vec(A.size()));
for(int i=0;i<A.size();++i)
B[i][i]=1;
while(n>0){
if(n&1) B=mul(B,A);
A=mul(A,A);
n>>=1;
}
return B;
}
int main()
{
ll b,d,n,ans;
cin>>b>>d>>n;
if(n==0) {cout<<"1\n";return 0;}
if (n==1) {cout<<b<<endl;return 0;}
mat a(2,vec(2));
a[0][0]=b%mod;a[0][1]=(d-b*b)/4%mod;
a[1][0]=1ll;a[1][1]=0ll;
a=pow(a,n-1);
ans=(mul(a[0][0],b)+mul(a[0][1],2))%mod;
if(n%2==0&&b*b!=d) ans=(ans+mod-1)%mod;
cout<<ans<<endl;
return 0;
}