@loj - 2106@ 「JLOI2015」有意义的字符串
@description@
B 君有两个好朋友,他们叫宁宁和冉冉。有一天,冉冉遇到了一个有趣的题目:输入 \(b, d, n\),求:
\]
@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\)。则:
= \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}\]
再对等式进行变形:
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」有意义的字符串的更多相关文章
- 【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\) ...
- LOJ #6436. 「PKUSC2018」神仙的游戏(字符串+NTT)
题面 LOJ #6436. 「PKUSC2018」神仙的游戏 题解 参考 yyb 的口中的长郡最强选手 租酥雨大佬的博客 ... 一开始以为 通配符匹配 就是类似于 BZOJ 4259: 残缺的字符串 ...
- LOJ#3104「TJOI2019」甲苯先生的字符串
题目描述 一天小甲苯得到了一条神的指示,他要把神的指示写下来,但是又不能泄露天机,所以他要用一种方法把神的指示记下来. 神的指示是一个字符串,记为字符串 \(s_1\),\(s_1\) 仅包含小写字母 ...
- Loj #3059. 「HNOI2019」序列
Loj #3059. 「HNOI2019」序列 给定一个长度为 \(n\) 的序列 \(A_1, \ldots , A_n\),以及 \(m\) 个操作,每个操作将一个 \(A_i\) 修改为 \(k ...
- loj#2721. 「NOI2018」屠龙勇士
题目链接 loj#2721. 「NOI2018」屠龙勇士 题解 首先可以列出线性方程组 方程组转化为在模p意义下的同余方程 因为不保证pp 互素,考虑扩展中国剩余定理合并 方程组是带系数的,我们要做的 ...
- Loj #2719. 「NOI2018」冒泡排序
Loj #2719. 「NOI2018」冒泡排序 题目描述 最近,小 S 对冒泡排序产生了浓厚的兴趣.为了问题简单,小 S 只研究对 *\(1\) 到 \(n\) 的排列*的冒泡排序. 下面是对冒泡排 ...
- Loj #2192. 「SHOI2014」概率充电器
Loj #2192. 「SHOI2014」概率充电器 题目描述 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品--概率充电器: 「采用全新纳米级加工技术,实现元件与导线能否通电完 ...
- Loj #3096. 「SNOI2019」数论
Loj #3096. 「SNOI2019」数论 题目描述 给出正整数 \(P, Q, T\),大小为 \(n\) 的整数集 \(A\) 和大小为 \(m\) 的整数集 \(B\),请你求出: \[ \ ...
- Loj #3093. 「BJOI2019」光线
Loj #3093. 「BJOI2019」光线 题目描述 当一束光打到一层玻璃上时,有一定比例的光会穿过这层玻璃,一定比例的光会被反射回去,剩下的光被玻璃吸收. 设对于任意 \(x\),有 \(x\t ...
随机推荐
- HDU2825AC自动机+状压
//我感觉这题不如叫你不看代码就不知道题干在说啥,强烈吐槽 Liyuan lives in a old apartment. One day, he suddenly found that there ...
- Springboot 关于日期时间格式化处理方式总结
项目中使用LocalDateTime系列作为DTO中时间的数据类型,但是SpringMVC收到参数后总报错,为了配置全局时间类型转换,尝试了如下处理方式. 注:本文基于Springboot2.x测试, ...
- 百万年薪架构师一文整理RabbitMQ、ActiveMQ、RocketMQ、Kafka
一般来说,大型应用通常会被拆分成多个子系统,这些子系统可能会部署在多台机器上,也可能只是一台机器的多个进程中,这样的应用就是分布式应用.在讨论分布式应用时,很多初学者会把它和集群这个概念搞混,因为从部 ...
- NetCore项目实战篇08---Docker挂载mysql并连接.netCoreWeb
我们的项目之前在直接连接的mysql,今天我们将通过docker挂载mysql 并与我们开发的webapi项目连接. 1. 安装docker 下载地址: https://download.docker ...
- django-模型层(ORM语法)
今日内容概要(重要) 模型层(ORM语法):跟数据库打交道的 单表查询(增删改查) 常见的十几种查询方法 神奇的双下划线查询 多表操作 外键字段的增删改查 跨表查询(重点) 子查询 联表查询 今日内容 ...
- 前端基础知识之html和css全解
前端回顾 目录 前端回顾 基础知识 HTTP协议 认识HTML HTML组成 HTML标签 div和span标签 特殊的属性 常用标签 认识css 选择器 属性 前端就是展示给用户并且与用户进行交互的 ...
- 01 . Mysql简介及部署
Mysql数据库简介 什么是数据? 数据(data)是事实或观察的结果,是对客观事物的逻辑归纳,是用于表示客观事物的未经加工的原始素材,数据是信息的表现形式和载体,可以是符号,文字,数字,语音,图 ...
- vc程序设计--图形绘制1
利用绘图函数创建填充区.Windows通过使用当前画笔画一个图形的边界,然后用当前的刷子填充这个图形来创建-一个填充图形.共有三个填充图形,第一个是用深灰色画刷填充带圆角的矩形,第二个是采用亮 ...
- conda虚拟环境安装
一.背景 需要学习mxnet,建一个conda虚拟软件环境. 二.步骤 1.下载anaconda安装文件:https://mirrors.tuna.tsinghua.edu.cn/anaconda/m ...
- Chisel3 - util - Math vs. CircuitMath
https://mp.weixin.qq.com/s/8lC8vQnBdKW9C39H0QFFkA 对数相关的辅助方法,Math通过软件方法实现,CircuitMath通过硬件方法实现. ...