题目大意:
给出b,d,nb,d,nb,d,n,求
(b+d2)n(\frac{b+\sqrt{d}}{2})^n(2b+d)n
其中,
分析:
对于一个数列ana_nan,满足
an=pan−1+qan−2a_n=pa_{n-1}+qa_{n-2}an=pan−1+qan−2
则有
an+μan−1=(p+μ)(an−1+μan−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+\mup+μ。
而本题中p+μ=b+d2p+\mu=\frac{b+\sqrt{d}}{2}p+μ=2b+d,解出p=bp=bp=b,q=d−b24q=\frac{d-b^2}{4}q=4d−b2。
进一步得到
当a0=2a_0=2a0=2,a1=ba_1=ba1=b,通项满足
an=(b+d2)n+(b−d2)na_n=(\frac{b+\sqrt{d}}{2})^n+(\frac{b-\sqrt{d}}{2})^nan=(2b+d)n+(2b−d)n
(b+d2)n=an−(b−d2)n(\frac{b+\sqrt{d}}{2})^n=a_n-(\frac{b-\sqrt{d}}{2})^n(2b+d)n=an−(2b−d)n
而(b−d2)∈(−1,0](\frac{b-\sqrt{d}}{2})\in(-1,0](2b−d)∈(−1,0],所以(b−d2)n∈(−1,1)(\frac{b-\sqrt{d}}{2})^n\in(-1,1)(2b−d)n∈(−1,1)。
所以只有当(b−d2)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);
}