题目大意:
给出
b
,
d
,
n
b,d,n
b,d,n,求
(
b
+
d
2
)
n
(\frac{b+\sqrt{d}}{2})^n
(2b+d)n
其中,
分析:
对于一个数列
a
n
a_n
an,满足
a
n
=
p
a
n
−
1
+
q
a
n
−
2
a_n=pa_{n-1}+qa_{n-2}
an=pan−1+qan−2
则有
a
n
+
μ
a
n
−
1
=
(
p
+
μ
)
(
a
n
−
1
+
μ
a
n
−
2
)
a_n+\mu a_{n-1}=(p+\mu)(a_{n-1}+\mu a_{n-2})
an+μan−1=(p+μ)(an−1+μan−2)
那么就是一个等比数列,其中公比是
p
+
μ
p+\mu
p+μ。
而本题中
p
+
μ
=
b
+
d
2
p+\mu=\frac{b+\sqrt{d}}{2}
p+μ=2b+d,解出
p
=
b
p=b
p=b,
q
=
d
−
b
2
4
q=\frac{d-b^2}{4}
q=4d−b2。
进一步得到
当
a
0
=
2
a_0=2
a0=2,
a
1
=
b
a_1=b
a1=b,通项满足
a
n
=
(
b
+
d
2
)
n
+
(
b
−
d
2
)
n
a_n=(\frac{b+\sqrt{d}}{2})^n+(\frac{b-\sqrt{d}}{2})^n
an=(2b+d)n+(2b−d)n
(
b
+
d
2
)
n
=
a
n
−
(
b
−
d
2
)
n
(\frac{b+\sqrt{d}}{2})^n=a_n-(\frac{b-\sqrt{d}}{2})^n
(2b+d)n=an−(2b−d)n
而
(
b
−
d
2
)
∈
(
−
1
,
0
]
(\frac{b-\sqrt{d}}{2})\in(-1,0]
(2b−d)∈(−1,0],所以
(
b
−
d
2
)
n
∈
(
−
1
,
1
)
(\frac{b-\sqrt{d}}{2})^n\in(-1,1)
(2b−d)n∈(−1,1)。
所以只有当
(
b
−
d
2
)
n
>
1
(\frac{b-\sqrt{d}}{2})^n>1
(2b−d)n>1时,答案要减小1。
代码:
/**************************************************************
Problem: 4002
User: ypxrain
Language: C++
Result: Accepted
Time:56 ms
Memory:1292 kb
****************************************************************/
#include <iostream>
#include <cstdio>
#include <cmath>
#define LL unsigned long long
const LL mod=7528443412579576937;
using namespace std;
LL b,d,n,ans;
struct rec{
LL a[2][2];
}A,B;
LL mul(LL x,LL y)
{
LL tmp=0;
for (;y;y>>=1)
{
if (y&1) tmp=(tmp+x)%mod;
x=(x+x)%mod;
}
return tmp;
}
rec operator *(rec a,rec b)
{
rec c;
for (int i=0;i<2;i++)
{
for (int j=0;j<2;j++) c.a[i][j]=0;
}
for (int k=0;k<2;k++)
{
for (int i=0;i<2;i++)
{
for (int j=0;j<2;j++)
{
c.a[i][j]=(c.a[i][j]+mul(a.a[i][k],b.a[k][j]))%mod;
}
}
}
return c;
}
void power(LL n)
{
for (;n;n>>=1)
{
if (n&1) B=B*A;
A=A*A;
}
}
int main()
{
scanf("%lld%lld%lld",&b,&d,&n);
A.a[0][0]=0,A.a[0][1]=(d-b*b)/4,A.a[1][0]=1,A.a[1][1]=b;
B.a[0][0]=1,B.a[1][1]=1;
power(n);
ans=(mul(B.a[0][0],2)+mul(B.a[1][0],b))%mod;
if ((b*b!=d) && (n%2==0)) ans=(ans+mod-1)%mod;
printf("%lld\n",ans);
}