@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. js 简单有效判断日期有效性(含闰年)

    原文:https://zhidao.baidu.com/question/1701946584925153620.html 要想精确验证,最容易想到的方法就是通过月份判断日期是否合法(1~28/29/ ...

  2. Oracle操作时间-----摘抄而来

    1.日期时间间隔操作  当前时间减去7分钟的时间  select sysdate,sysdate - interval ’7’ MINUTE from dual  当前时间减去7小时的时间  sele ...

  3. 201771010128王玉兰《面向对象程序设计(Java)》第十二周学习总结

    第一部分:理论知识 1.AWT与Swing简介 (1)Swing用户界面库是非基于对等体的GUI工具箱. Swing具有更丰富并且更方便的用户界面元素集合. Swing对底层平台的依赖很少,因此与 ...

  4. POJ1661

    题目链接:http://poj.org/problem?id=1661 解题思路: 离散化处理 + DP. 首先,纵坐标除了用来判断老鼠是否会摔死之外基本没用,主要考虑横坐标,只要求出在横坐标上必须走 ...

  5. Centos 安装 docker 和 docker-compose

    一.docker安装 1.卸载旧版本 sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ d ...

  6. 转 js自定义事件——Event和CustomEvent

    之前在学习自定义事件时,在MDN的Event.initEvent()页面顶端有写:该特性已从Web标准中删除,虽然一些浏览器目前仍然支持它,但也许会在未来的某个时间停止支持,请尽量不要使用该特性. 作 ...

  7. C# 数据操作系列 - 16 SqlSugar 完结篇

    0. 前言 前一篇我们详细的介绍了SqlSugar的增删改查,那些已经满足我们在日常工程开发中的使用了.但是还有一点点在开发中并不常用,但是却非常有用的方法.接下来让我们一起来看看还有哪些有意思的内容 ...

  8. ketchup服务治理

    ketcup  git地址:https://github.com/simple-gr/ketchup 服务治理是什么 企业为了确保事情顺利完成而实施的过程,包括最佳实践.架构原则.治理规程.规律以及其 ...

  9. excel导入mysql数据

    excel加载mysql数据 1.第一步,选择从mysql导入数据 2.单击会出现弹框: 3.可能有的同学的,这里缺少插件,例如: 4.去下载 这个 插件安装即可.https://dev.mysql. ...

  10. pyqt5-多线程初步

    多线程是实现并发的一个重要手段.在GUI编程中,经常需要将耗费时间较多的任务分离出来成为一个线程,避免对主线程造成影响(造成界面无响应). 在Qt中,最简单的多线程主要通过继承QThread类实现,重 ...