PS:如果读过题了可以跳过题目描述直接到题解部分
提交链接:洛谷 P3263 [JLOI2015]有意义的字符串
B 君有两个好朋友,他们叫宁宁和冉冉。有一天,冉冉遇到了一个有趣的题目:输入 b;d;n,求
⌊(b+d2)n⌋modp\lfloor ( \frac{b+\sqrt{d}}{2} ) ^n \rfloor \mathrm{mod} \ p⌊(2b+d)n⌋mod p
其中p=7528443412579576937p=7528443412579576937p=7528443412579576937
一行三个整数 b;d;n
一行一个数表示模 7528443412579576937 之后的结果。
1 5 9
76
其中 0 看到 (b+d2)n( \frac{b+\sqrt{d}}{2} ) ^n(2b+d)n 的时候,数学比较好的人应该就会反应出一个平方差公式,所以就会想到 (b−d2)n( \frac{b-\sqrt{d}}{2} ) ^n(2b−d)n,那么我们会发现,这两个是方程x2−bx+b2−d4=0x^2-bx+\frac{b^2-d}{4}=0x2−bx+4b2−d=0的两根。 最后当b2≠db^2≠db2=d且nnn为偶数的时候,答案为fn−1f_n-1fn−1,否则为fnf_nfn。 注意不要把矩阵初始化的时候打错了,我调了一个多小时,最后发现是初始化的时候有两个写反了。题解
移项可得:x2=bx+b2−d4x^2=bx+\frac{b^2-d}{4}x2=bx+4b2−d
再同时乘以xn−2x^{n-2}xn−2可得:xn=bxn−1+b2−d4xn−2x^n=bx^{n-1}+\frac{b^2-d}{4}x^{n-2}xn=bxn−1+4b2−dxn−2
令fi=(b+d2)i+(b−d2)if_i=( \frac{b+\sqrt{d}}{2} ) ^i+( \frac{b-\sqrt{d}}{2} ) ^ifi=(2b+d)i+(2b−d)i,则fif_ifi为整数,且fi=bfi−1+b2−d4fi−2f_i=bf_{i-1}+\frac{b^2-d}{4}f_{i-2}fi=bfi−1+4b2−dfi−2,f0=2f_0=2f0=2,f1=bf_1=bf1=b,所以可以用矩阵乘法求出fnf_nfn(因为会爆long long,所以推荐用__int128)代码实现
100pts
//洛谷 P3263 [JLOI2015]有意义的字符串
#pragma GCC optimize(3)
#include
上一篇:Gin 基础