在这篇题解中,我会将各个部分的证明分成不同的推导过程,以达到逐一击破的效果。

引理 1:\(f(n)=2f(n-1)+f(n-2)\)

我的证明挺繁琐的,过程如下:

\[(1+\sqrt 2)^{n-2}=e(n-2)+f(n-2)\sqrt 2
\]
\[(1+\sqrt 2)^{n-1}=e(n-1)+f(n-1)\sqrt 2
\]
\[(1+\sqrt 2)^{n-1}=(1+\sqrt 2)^{n-2}(1+\sqrt 2)
\]
\[=(e(n-2)+2f(n-2))+(e(n-2)+f(n-2))\sqrt 2
\]
\[e(n-1)=e(n-2)+2f(n-2),f(n-1)=e(n-2)+f(n-2)
\]
\[f(n)=e(n-1)+f(n-1)=2(e(n-2)+f(n-2))+f(n-2)
\]
\[f(n)=2f(n-1)+f(n-2)
\]

那么递推式有了,如何和 \(\operatorname{lcm}\) 扯上关系呢?

引理 2:\(f(n+m)=f(n+1)f(m)+bf(n)f(m-1)\)

这个引理的完整描述过程如下:

如果 \(f(0)=0,f(1)=1,f(n)=af(n-1)+bf(n-2)\),且 \(\gcd(a,b)=1\),则有 \(\gcd(f(x),f(y))=f(\gcd(x,y))\)。

考虑这个东西长得和个兔子数列似的,于是给他弄个转移矩阵。容易发现有:

\[\begin{bmatrix}f(n+1)\ \ f(n)\end{bmatrix}=\begin{bmatrix}a\ \ 1\\b\ \ 0\end{bmatrix}\begin{bmatrix}f(n)\ \ f(n-1)\end{bmatrix}
\]

这个转移矩阵是不平凡的:

\[\begin{bmatrix}f(n+1)\ \ f(n)\\bf(n)\ \ bf(n-1)\end{bmatrix}\begin{bmatrix}a\ \ 1\\b\ \ 0\end{bmatrix}=\begin{bmatrix}af(n+1)+bf(n)\ \ f(n+1)\\bf(n+1)\ \ bf(n)\end{bmatrix}=\begin{bmatrix}f(n+2)\ \ f(n+1)\\bf(n+1)\ \ bf(n)\end{bmatrix}
\]
\[\begin{bmatrix}a\ \ 1\\b\ \ 0\end{bmatrix}^1=\begin{bmatrix}f(2)\ \ f(1)\\bf(1)\ \ bf(0)\end{bmatrix},\begin{bmatrix}a\ \ 1\\b\ \ 0\end{bmatrix}^n=\begin{bmatrix}f(n+1)\ \ f(n)\\bf(n)\ \ bf(n-1)\end{bmatrix}
\]

那么就有:

\[\begin{bmatrix}f(n+m+1)\ \ f(n+m)\end{bmatrix}=\begin{bmatrix}a\ \ 1\\b\ \ 0\end{bmatrix}^m\begin{bmatrix}f(n+1)\ \ f(n)\end{bmatrix}
\]
\[=\begin{bmatrix}f(m+1)\ \ f(m)\\bf(m)\ \ bf(m-1)\end{bmatrix}\begin{bmatrix}f(n+1)\ \ f(n)\end{bmatrix}
\]
\[=\begin{bmatrix}f(n+1)f(m+1)+bf(m)f(n)\ \ f(n+1)f(m)+bf(n)f(m-1)\end{bmatrix}
\]

引理 1 得证。

引理 3:\(\gcd(f(x),f(y))=f(\gcd(x,y))\)

显然有:

\[\gcd(f(n+m),f(n))=\gcd(f(n+1)f(m)+bf(n)f(m-1),f(n))
\]
\[\gcd(f(n+m),f(n))=\gcd(f(n+1)f(m),f(n))
\]

若 \(\gcd(f(n-1),f(n-2))=1\),则有:

\[\gcd(f(n),f(n-1))=\gcd(af(i-1)+bf(n-2),f(n-1))=1
\]

由于 \(\gcd(f(1),f(0))=1\),所以 \(\gcd(f(n),f(n-1))=1\)。

所以 \(\gcd(f(n+m),f(n))=\gcd(f(m),f(n))\)。

我们从辗转相除的角度化简,可以得到:

\[\gcd(f(n+m),f(n))=\gcd(f(\gcd(n+m,n)),f(0))
\]
\[=f(\gcd(n+m,n))=f(\gcd(m,n))=\gcd(f(m),f(n))
\]

引理 4:\(\operatorname{lcm}(S)=\prod\limits_{T\subset S}\gcd(T)^{(-1)^{|T|-1}}\)

特殊说明一下,\(S,T\) 为非空集合。

注意力惊人的注意到:

\[\operatorname{lcm}(S)=\prod_{p\in prime}p^{\max\limits_{i\in S}cnt_{i,p}}
\]
\[\gcd(S)=\prod_{p\in prime}p^{\min\limits_{i\in S}cnt_{i,p}}
\]

其中 \(cnt_{i,p}\) 表示 \(i\) 中 \(p\) 这个质因子的个数。

想到最值反演。那么有:

\[\operatorname{lcm}(S)=\prod_{p\in prime}p^{\max\limits_{i\in S}cnt_{i,p}}
\]
\[\operatorname{lcm}(S)=\prod_{p\in prime}p^{\sum\limits_{T\subseteq S}\min\limits_{i\in T}cnt_{i,p}(-1)^{|T|-1}}
\]
\[\operatorname{lcm}(S)=\prod_{T\subseteq S}(\prod_{p\in prime}p^{\min\limits_{i\in T}cnt_{i,p}})^{(-1)^{|T|-1}}
\]
\[\operatorname{lcm}(S)=\prod_{T\subseteq S}\gcd(T)^{(-1)^{|T|-1}}
\]

\(g(n)\) 的第一推导

设 \(U=\{1,2,\dots,n\}\),则有:

\[g(n)=\prod_{T\subseteq U}(\gcd\limits_{i\in T}f(i))^{(-1)^{|T|-1}}
\]
\[g(n)=\prod_{T\subseteq U}f(\gcd(T))^{(-1)^{|T|-1}}
\]

看到 \(\gcd\),想到莫比乌斯反演:

\[g(n)=\prod_{i=1}^nf(i)^{\sum\limits_{T\subseteq U}[\gcd(T)=i](-1)^{|T|-1}}
\]

记 \(h(i)=\sum\limits_{T\subseteq U}[\gcd(T)=i](-1)^{|T|-1},H(i)=\sum\limits_{i|d}h(d)\),我们就要开启下一部分了。

引理 5:\(H(i)=1\)

设 \(S_i=\{1,2,\dots,\lfloor\dfrac ni\rfloor\}\)(显然 \(|S|>0\)),\(T\) 仍然是非空集合,则有:

\[H(i)=\sum_{i|d}\sum_{T\subseteq U}[\gcd(T)=d](-1)^{|T|-1}
\]
\[=\sum_{T\subseteq U}[i|\gcd(T)](-1)^{|T|-1}
\]
\[=\sum_{T\subseteq S_i}(-1)^{|T|-1}=-\sum_{T\subseteq S_i}(-1)^{|T|}
\]
\[=-(\sum_{i=0}^{|S_i|}\binom{|S|}i(-1)^i-1)
\]
\[=-(1-1)^{|S_i|}+1=1
\]

\(g(n)\) 的最终推导

根据莫比乌斯反演,有:

\[h(i)=\sum_{i|d}\mu(\frac di)H(d)=\sum_{i|d}\mu(\frac di)
\]

带回 \(g(n)\) 中,得:

\[g(n)=\prod_{i=1}^nf(i)^{\sum\limits_{i|d}\mu(\frac di)}
\]
\[g(n)=\prod_{d=1}^n\prod_{i|d}f(i)^{\mu(\frac di)}
\]

很好算。时间复杂度 \(O(\sum n\log n)\)。

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+5;
int t,n,p,mu[N],f[N],s[N];
int qpow(int x,int y){
int re=1;
while(y){
if(y&1) re=re*x%p;
x=x*x%p,y>>=1;
}return re;
}signed main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>t,mu[1]=1;
for(int i=1;i<N;i++)
for(int j=i*2;j<N;j+=i) mu[j]-=mu[i];
while(t--){
cin>>n>>p,f[1]=s[1]=1;
for(int i=2;i<=n;i++)
f[i]=(f[i-1]*2+f[i-2])%p,s[i]=1;
for(int i=1;i<=n;i++){
int x=f[i],y=qpow(x,p-2);
for(int j=i,k=1;j<=n;j+=i,k++)
s[j]=s[j]*(!mu[k]?1:mu[k]>0?x:y)%p;
}int re=0,g=s[1];
for(int i=1;i<=n;)
re=(re+g*i)%p,g=g*s[++i]%p;
cout<<re<<"\n";
}return 0;
}

[BZOJ4833] 最小公倍佩尔数 题解的更多相关文章

  1. 【BZOJ4833】最小公倍佩尔数(min-max容斥)

    [BZOJ4833]最小公倍佩尔数(min-max容斥) 题面 BZOJ 题解 首先考虑怎么求\(f(n)\),考虑递推这个东西 \((1+\sqrt 2)(e(n-1)+f(n-1)\sqrt 2) ...

  2. BZOJ4833: [Lydsy1704月赛]最小公倍佩尔数(min-max容斥&莫比乌斯反演)(线性多项式多个数求LCM)

    4833: [Lydsy1704月赛]最小公倍佩尔数 Time Limit: 8 Sec  Memory Limit: 128 MBSubmit: 240  Solved: 118[Submit][S ...

  3. [Lydsy1704月赛] 最小公倍佩尔数

    4833: [Lydsy1704月赛]最小公倍佩尔数 Time Limit: 8 Sec  Memory Limit: 128 MBSubmit: 202  Solved: 99[Submit][St ...

  4. BZOJ4833: [Lydsy1704月赛]最小公倍佩尔数

    Problem 传送门 Sol 容易得到 \[f_n=e_{n-1}+f_{n-1},e_{n-1}=f_{n-1}+e_{n-1},f_1=e_1=1\] 那么 \[f_n=2\times \sum ...

  5. BZOJ 4833: [Lydsy1704月赛]最小公倍佩尔数(数论 + 最值反演)

    题面 令 \({(1+\sqrt 2)}^n=e(n)+f(n)*\sqrt2\) ,其中 \(e(n),f(n)\) 都是整数,显然有 \({(1-\sqrt 2)}^n=e(n)-f(n)*\sq ...

  6. 【bzoj 4833】[Lydsy1704月赛]最小公倍佩尔数

    Description 令 $(1+\sqrt 2)^n=e(n)+\sqrt 2\cdot f(n)$ ,其中 $e(n),f(n)$ 都是整数,显然有 $(1-\sqrt 2)^n=e(n)-\s ...

  7. [bzoj 4833]最小公倍佩尔数

    传送门 Description   Let \((1+\sqrt2)^n=e(n)+f(n)\cdot\sqrt2\) , both \(e(n)\) and \(f(n)\) are integer ...

  8. C#版 - Leetcode 504. 七进制数 - 题解

    C#版 - Leetcode 504. 七进制数 - 题解 Leetcode 504. Base 7 在线提交: https://leetcode.com/problems/base-7/ 题目描述 ...

  9. C#版 - Leetcode 306. 累加数 - 题解

    版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C#版 - L ...

  10. C#版(打败97.89%的提交) - Leetcode 202. 快乐数 - 题解

    版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C#版 - L ...

随机推荐

  1. vue 的provide 和 inject

    1.功能说明 在开发过程中,在子组件中如何获取父组件或者祖父级的数据.这个我们之前的做法是在子组件中找到父组件实例,然后使用父组件的数据.这样其实不是很自然. 在vue 中提供了 provide 和 ...

  2. [Cnblogs.Architecture][v20.5.1] 使用 AddLongToJsonConverter() 将 long 序列化为 string

    场景 浏览器的 JSON 反序列化无法完整将 long 类型转换为 number,最后一位会被四舍五入. 因此需要将 long 类型转为 string 发送到前端. 适用版本 v20.5.1 使用方法 ...

  3. Vue实现记住账号密码功能

    实现思路: 用户登录时若勾选"记住我"功能选项,则将登录名和密码(加密后)存入本地缓存,下次登录页面加载时自动获取保存好的账号和密码(需解密),回显到登录输入框中. 说到存入本地缓 ...

  4. CMYK与RGB参数转换公式及转换方法

    1. RGB色彩模式 自然界中绝大部分的可见光谱可以用红.绿和蓝三色光按不同比例和强度的混合来表示.RGB分别代表着3种颜色:R代表红色,G代表绿色.B代表蓝色.RGB模型也称为加色模型,如图5所示. ...

  5. jsp移动端和pc端页面判断及切换

    function goPAGE() { if ((navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobi ...

  6. uni-app生命周期小测

    标签: js uni-app 前情 uni-app是我很喜欢的跨平台框架,它能开发小程序,H5,APP(安卓/iOS),对前端开发很友好,自带的IDE让开发体验也很棒,公司项目就是主推uni-app. ...

  7. nexus如何上传自己的依赖包

    一.创建第三方包仓库创建第三方jar包的仓库选用hosted 取名为nexus-3rd 然后再public组中加入nexus-3rd,交给public管理 二.创建用户仓库创建完成以后可以创建一个管理 ...

  8. Linux 中的内存使用率计算方式

    背景介绍 在工作中处理问题的时候,遇到一个问题,自己根据 top 命令时查看到的 used 和 total 计算出来的内存使用率已经达到 90% 以上了,但是系统自带的监控软件计算出来的使用率往往没有 ...

  9. 查看MySQL数据库所有的表名、表注释、字段名称、类型、长度、备注,一键导出生成数据库字典

    一.先了解下INFORMATION_SCHEMA1.在MySQL中,把INFORMATION_SCHEMA看作是一个数据库,确切说是信息数据库.其中保存着关于MySQL服务器所维护的所有其他数据库的信 ...

  10. Qt/C++音视频开发75-获取本地有哪些摄像头名称/Qt内置函数方式

    一.前言 在需要打开本地摄像头的场景中,有个需求绕不开,那就是如何获取本地有哪些摄像头设备名称,这样可以提供下拉框给用户选择,不然你让用户去填设备名,你觉得用户会知道是啥,他会操作吗?就算你提供了详细 ...