BZOJ 4002 有意义的字符串

题目:

给定b,d,nb,d,nb,d,n,求(b+d2)nmod  7528443412579576937\\lfloor(\\frac{b+\\sqrt{d}}{2})^n\\rfloor\\mod 7528443412579576937(2b+d)nmod7528443412579576937

其中,0&lt;b2d(b+1)21018,n10180&lt;b^2\\leq d\\leq(b+1)^2\\leq 10^{18},n\\leq 10^{18}0<b2d(b+1)21018,n1018,并且bmod&ThinSpace;&ThinSpace;2=1,dmod&ThinSpace;&ThinSpace;4=1b\\mod 2=1,d\\mod 4 =1bmod2=1,dmod4=1

思路:

求这样一个东西的nnn次方然后向下取整,再取模,这很显然是不能够直接快速幂的。所以对下取整里面的东西进行考虑。将(b+d2)n(\\frac{b+\\sqrt{d}}{2})^n(2b+d)n二项式展开,会发现只有d\\sqrt dd的奇数次项是小数,其余都是整数。因此可以通过加上(bd2)n(\\frac{b-\\sqrt{d}}{2})^n(2bd)n来消去d\\sqrt dd的奇数次项。

所以我们将所求转化为[(b+d2)n+(bd2)n](bd2)n\\lfloor [(\\frac{b+\\sqrt d}{2})^n+ (\\frac{b-\\sqrt d}{2})^n]- (\\frac{b-\\sqrt d}{2})^n \\rfloor[(2b+d)n+(2bd)n](2bd)n

对于前半部分,这样的形式正好对应了二阶线性递推的通项的形式。

x1=b+d2,x2=bd2x_1=\\frac{b+\\sqrt d}{2},x_2=\\frac{b-\\sqrt d}{2}x1=2b+d,x2=2bd ,则原式前半部分变成x1n+x2nx_1^n+x_2^nx1n+x2n

f(n)=x1n+x2nf(n)=x_1^n+x_2^nf(n)=x1n+x2n,则该函数的二阶线性递推式为

f(n)(x1+x2)f(n1)+(x1x2)f(n2)=0f(n)-(x_1+x_2)f(n-1)+(x_1x_2)f(n-2)=0f(n)(x1+x2)f(n1)+(x1x2)f(n2)=0

化简得

f(n)=(x1+x2)f(n1)(x1x2)f(n2)f(n)=(x_1+x_2)f(n-1)-(x_1x_2)f(n-2)f(n)=(x1+x2)f(n1)(x1x2)f(n2)

f(n)=bf(n1)+db24f(n2)f(n)=bf(n-1)+\\frac{d-b^2}{4}f(n-2)f(n)=bf(n1)+4db2f(n2)

对于后半部分,可以发现d=b\\lfloor\\sqrt d\\rfloor=bd=b,所以0(bd)n&lt;10\\leq|(b-\\sqrt d)^n|&lt;10(b

收藏 打印
您的足迹: