构造数列an=(b+d√2)n+(b−d√2)n
xn+yn=(xn−1+yn−1)∗(x+y)−(xn−2+yn−2)∗xy
因此an=b∗an−1+d−b∗b4an−2
然后就可以矩乘得到an
由于an 为正整数且|(b−d√2)n|<1
因此 (b−d√2)n 只在n为偶数且d√!=b 时为正。此时答案需要-1。
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define mod 7528443412579576937ll
ll b,d,n;
ull mul(ull x,ull y)
{
ull ret=0;
while(y)
{
if(y&1)ret=(ret+x)%mod;
x=(x+x)%mod;y>>=1;
}
return ret;
}
struct Matrix
{
ull w[3][3];
void init()
{
memset(w,0,sizeof(w));
w[0][0]=w[1][1]=1;
}
friend Matrix operator * (const Matrix &r1,const Matrix &r2)
{
Matrix ret;
memset(&ret,0,sizeof(ret));
for(int i=0;i<=1;i++)
for(int j=0;j<=1;j++)
for(int k=0;k<=1;k++)
ret.w[i][j]=(ret.w[i][j]+mul(r1.w[i][k],r2.w[k][j]))%mod;
return ret;
};
}mat;
Matrix qpow(Matrix x,ll y)
{
Matrix ret;ret.init();
while(y)
{
if(y&1)ret=ret*x;
x=x*x;y>>=1;
}
return ret;
}
int main()
{
//freopen("tt.in","r",stdin);
scanf("%lld%lld%lld",&b,&d,&n);
if(n==0)return puts("1"),0;
mat.w[0][1]=1;
mat.w[1][0]=(d-b*b)/4;
mat.w[1][1]=b;
mat=qpow(mat,n-1);
ll t=(mul(mat.w[1][0],2)+mul(mat.w[1][1],b))%mod;
if(n%2==0&&d!=b*b)t=((ull)t-1+mod)%mod;
printf("%lld\n",t);
return 0;
}