@description@

B 君有两个好朋友,他们叫宁宁和冉冉。有一天,冉冉遇到了一个有趣的题目:输入 \(b, d, n\),求:

\[\lfloor(\frac{b + \sqrt{d}}{2})^n\rfloor \mod 7528443412579576937
\]

原题戳我查看owo

@solution@

这道题的思路最早可以追溯到这一道经典题目吧。。。

注意到数据范围满足 \(b^2 \le d < (b + 1)^2\)(虽然样例不满足),这意味着 \(|\frac{b - \sqrt{d}}{2}| < 1\)。

利用共轭的性质。如果我们求出 \(f(n) = (\frac{b + \sqrt{d}}{2})^n + (\frac{b - \sqrt{d}}{2})^n\) 的整数部分,则题目所要的东西实际上 = f(n) 或 f(n) - 1。

尝试递推。看到分母除 2,想到二次方程的求根公式。

记 \(p = (\frac{b + \sqrt{d}}{2}), q = (\frac{b - \sqrt{d}}{2})\),则 p, q 应该为方程 \(x^2 - bx + \frac{b^2 - d}{4} = 0\) 两根。

也就说有 \(p^2 = bp - \frac{b^2 - d}{4}, q^2 = bq - \frac{b^2 - d}{4}\)

然后就可以带入 f(n) 的式子里面降次,得到 f(n) 与 f(n-1),f(n-2) 的递推式子。矩阵幂即可。

-------分割线--------

当然还有另一种看起来更nb的推导方法。

我们构造 f(n) 的生成函数,记 \(F(x) = \sum_{i=0}f(i)x^i\)。则:

\[F(x) = \sum_{i=0}(\frac{b + \sqrt{d}}{2})^ix^i + \sum_{i=0}(\frac{b - \sqrt{d}}{2})^ix^i \\
= \frac{1}{1 - (\frac{b + \sqrt{d}}{2})x} + \frac{1}{1 - (\frac{b - \sqrt{d}}{2})x} \\
= \frac{2 - bx}{\frac{b^2 - d}{4}x^2 - bx + 1}\]

再对等式进行变形:

\[(\frac{b^2 - d}{4}x^2 - bx + 1)F(x) = 2 - bx \\
F(x) = -\frac{b^2 - d}{4}x^2F(x) + bxF(x) + 2 - bx
\]

对应项系数比较,除 0 和 1 以外,有 \(f(n) = -\frac{b^2 - d}{4}f(n-2) + bf(n-1)\)。得到了一样的结果。

其实这就是斐波那契的通项公式的逆推导过程。

@accepted code@

#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std; typedef unsigned long long ull; const ull MOD = 7528443412579576937LL;
ull add(ull A, ull B) {
return (A + B >= MOD ? A + B - MOD : A + B);
}
ull mul(ull A, ull B) {
ull C = 0;
for(ull i=B;i;i>>=1,A=add(A,A))
if( i & 1 ) C = add(C, A);
return C;
} ull A[2][2], R[2][2], C[2][2];
void mul(ull B[][2]) {
C[0][0] = add(mul(B[0][0], A[0][0]), mul(B[0][1], A[1][0]));
C[0][1] = add(mul(B[0][0], A[0][1]), mul(B[0][1], A[1][1]));
C[1][0] = add(mul(B[1][0], A[0][0]), mul(B[1][1], A[1][0]));
C[1][1] = add(mul(B[1][0], A[0][1]), mul(B[1][1], A[1][1]));
B[0][0] = C[0][0], B[0][1] = C[0][1], B[1][0] = C[1][0], B[1][1] = C[1][1];
} int main() {
ull b, d, n;
cin >> b >> d >> n;
A[0][0] = b, A[0][1] = (d - b*b) / 4;
A[1][0] = 1, A[1][1] = 0;
R[0][0] = R[1][1] = 1, R[1][0] = R[0][1] = 0;
for(ull i=n;i;i>>=1,mul(A))
if( i & 1 ) mul(R);
ull res = add(mul(b, R[1][0]), mul(2, R[1][1]));
if( n % 2 == 0 ) {
res = (res == 0 ? MOD - 1 : res - 1);
}
cout << res << endl;
}

@details@

有一个小疑问:照这样推导下来 \(f(n) = (\frac{b + \sqrt{d}}{2})^n + (\frac{b - \sqrt{d}}{2})^n\) 一定为整数。

可是为什么。可以证明这一点吗?

@loj - 2106@ 「JLOI2015」有意义的字符串的更多相关文章

  1. 【LOJ】#2106. 「JLOI2015」有意义的字符串

    题解 点一个技能点叫特征方程 就是 \(a_{n + 2} = c_1 a_{n + 1} + c_2 a_{n}\) \(x^2 = c_1 x + c_2\) 解出两根来是\(x_1,x_2\) ...

  2. LOJ #6436. 「PKUSC2018」神仙的游戏(字符串+NTT)

    题面 LOJ #6436. 「PKUSC2018」神仙的游戏 题解 参考 yyb 的口中的长郡最强选手 租酥雨大佬的博客 ... 一开始以为 通配符匹配 就是类似于 BZOJ 4259: 残缺的字符串 ...

  3. LOJ#3104「TJOI2019」甲苯先生的字符串

    题目描述 一天小甲苯得到了一条神的指示,他要把神的指示写下来,但是又不能泄露天机,所以他要用一种方法把神的指示记下来. 神的指示是一个字符串,记为字符串 \(s_1\),\(s_1\) 仅包含小写字母 ...

  4. Loj #3059. 「HNOI2019」序列

    Loj #3059. 「HNOI2019」序列 给定一个长度为 \(n\) 的序列 \(A_1, \ldots , A_n\),以及 \(m\) 个操作,每个操作将一个 \(A_i\) 修改为 \(k ...

  5. loj#2721. 「NOI2018」屠龙勇士

    题目链接 loj#2721. 「NOI2018」屠龙勇士 题解 首先可以列出线性方程组 方程组转化为在模p意义下的同余方程 因为不保证pp 互素,考虑扩展中国剩余定理合并 方程组是带系数的,我们要做的 ...

  6. Loj #2719. 「NOI2018」冒泡排序

    Loj #2719. 「NOI2018」冒泡排序 题目描述 最近,小 S 对冒泡排序产生了浓厚的兴趣.为了问题简单,小 S 只研究对 *\(1\) 到 \(n\) 的排列*的冒泡排序. 下面是对冒泡排 ...

  7. Loj #2192. 「SHOI2014」概率充电器

    Loj #2192. 「SHOI2014」概率充电器 题目描述 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品--概率充电器: 「采用全新纳米级加工技术,实现元件与导线能否通电完 ...

  8. Loj #3096. 「SNOI2019」数论

    Loj #3096. 「SNOI2019」数论 题目描述 给出正整数 \(P, Q, T\),大小为 \(n\) 的整数集 \(A\) 和大小为 \(m\) 的整数集 \(B\),请你求出: \[ \ ...

  9. Loj #3093. 「BJOI2019」光线

    Loj #3093. 「BJOI2019」光线 题目描述 当一束光打到一层玻璃上时,有一定比例的光会穿过这层玻璃,一定比例的光会被反射回去,剩下的光被玻璃吸收. 设对于任意 \(x\),有 \(x\t ...

随机推荐

  1. STM32 Keil 软件仿真设置

    设置 Dialog.DLL 分别为:DARMSTM.DLL和TARMSTM.DLL, Parameter 均为:-pSTM32F103RC,用于设置支持芯片的软硬件仿真

  2. ThinkPHP6.0 容器和依赖注入

    ThinkPHP6.0 容器和依赖注入 分为如下两部分: 依赖注入 容器 依赖注入 依赖注入其实本质上是指对类的依赖通过构造器完成自动注入: 在控制器架构方法和操作和方法中一旦对参数进行对象类型约束则 ...

  3. 模板:分页JSP(结合Servlet)

    DAO类(后续无需改变) package dao; import java.sql.Connection; import java.sql.PreparedStatement; import java ...

  4. Java——去除字符串中的中文

    import java.util.regex.Matcher; import java.util.regex.Pattern; public class RemoveStrChinese { priv ...

  5. pytest 使用

    import pytestfrom web_ui_YXBI.test_datas.common_datas import Common_Datas as cfrom selenium import w ...

  6. Redis详解(九)------ 哨兵(Sentinel)模式详解

    在上一篇博客----Redis详解(八)------ 主从复制,我们简单介绍了Redis的主从架构,但是这种主从架构存在一个问题,当主服务器宕机,从服务器不能够自动切换成主服务器,为了解决这个问题,我 ...

  7. spring cloud系列教程第六篇-Eureka集群版

    spring cloud系列教程第六篇-Eureka集群版 本文主要内容: 本文来源:本文由凯哥Java(kaigejava)发布在博客园博客的.转载请注明 1:Eureka执行步骤理解 2:集群原理 ...

  8. 一篇文章讲透Dijkstra最短路径算法

    Dijkstra是典型最短路径算法,计算一个起始节点到路径中其他所有节点的最短路径的算法和思想.在一些专业课程中如数据结构,图论,运筹学等都有介绍.其思想是一种基础的求最短路径的算法,通过基础思想的变 ...

  9. Java实现 LeetCode 789 逃脱阻碍者(曼哈顿距离)

    789. 逃脱阻碍者 你在进行一个简化版的吃豆人游戏.你从 (0, 0) 点开始出发,你的目的地是 (target[0], target[1]) .地图上有一些阻碍者,第 i 个阻碍者从 (ghost ...

  10. Java实现 LeetCode 430 扁平化多级双向链表

    430. 扁平化多级双向链表 您将获得一个双向链表,除了下一个和前一个指针之外,它还有一个子指针,可能指向单独的双向链表.这些子列表可能有一个或多个自己的子项,依此类推,生成多级数据结构,如下面的示例 ...