@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 ...
随机推荐
- 使用PHP得到所有的HTTP请求头
作者:老王 在PHP里,想要得到所有的HTTP请求头,可以使用getallheaders方法,不过此方法并不是在任何环境下都存在,比如说,你使用fastcgi方式运行PHP的话,就没有这个方法,所以说 ...
- 剑指Offer之变态跳台阶
题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 思路:由于青蛙每次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级,故除了 ...
- Linux系统部署JavaWeb项目(超详细tomcat,nginx,mysql)
转载自:Linux系统部署JavaWeb项目(超详细tomcat,nginx,mysql) 我的系统是阿里云的,香港的系统,本人选择的是系统镜像:CentOS 7.3 64位. 具体步骤: 配置Jav ...
- [FlashDevelop] 003.FlashDevelop + LayaFlash + Starling环境配置及实战
1.首先我们需要下载LayaStarling框架地址:http://layabox.com/index.php?m=content&c=index&a=lists&catid= ...
- GNS3配置问题(持续更新)
GNS3配置问题 1.关于All in One的GNS3提示"判断dynamips版本失败"的解决办法 当我们找到GNS3根目录里的dynamips.exe,执行会报错告诉我们缺少 ...
- Linux目录遍历opendir()
头文件:#include<dirent.h> DIR *opendir(const char *dirname); 打开目录 struct dirent *readdir(DIR *dir ...
- ES6-面向对象即类
简单介绍 在ES6面向对象基本上与java的类实现类似 1 class关键字,构造器和类分开了 1.1 ES5代码如下 <!DOCTYPE html> <html lang=&quo ...
- 【C++】cout、cerr、clog之间的区别
cout.cerr.clog三者都是标准IO库中提供的输出工具. 但是cout是支持重定向操作的.比如freopen()对于cout有效. clog和cerr主要用于错误输出. 因此,如果将程序输出重 ...
- Java实现 蓝桥杯VIP 算法提高 研究兔子的土豪
试题 算法提高 研究兔子的土豪 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 某天,HWD老师开始研究兔子,因为他是个土豪 ,所以他居然一下子买了一个可以容纳10^18代兔子的巨大 ...
- Java实现 LeetCode 680 验证回文字符串 Ⅱ(暴力)
680. 验证回文字符串 Ⅱ 给定一个非空字符串 s,最多删除一个字符.判断是否能成为回文字符串. 示例 1: 输入: "aba" 输出: True 示例 2: 输入: " ...