[BZOJ4833] 最小公倍佩尔数 题解
在这篇题解中,我会将各个部分的证明分成不同的推导过程,以达到逐一击破的效果。
引理 1:\(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))\)。
考虑这个东西长得和个兔子数列似的,于是给他弄个转移矩阵。容易发现有:
\]
这个转移矩阵是不平凡的:
\]
\]
那么就有:
\]
\]
\]
引理 1 得证。
引理 3:\(\gcd(f(x),f(y))=f(\gcd(x,y))\)
显然有:
\]
\]
若 \(\gcd(f(n-1),f(n-2))=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))\)。
我们从辗转相除的角度化简,可以得到:
\]
\]
引理 4:\(\operatorname{lcm}(S)=\prod\limits_{T\subset S}\gcd(T)^{(-1)^{|T|-1}}\)
特殊说明一下,\(S,T\) 为非空集合。
注意力惊人的注意到:
\]
\]
其中 \(cnt_{i,p}\) 表示 \(i\) 中 \(p\) 这个质因子的个数。
想到最值反演。那么有:
\]
\]
\]
\]
\(g(n)\) 的第一推导
设 \(U=\{1,2,\dots,n\}\),则有:
\]
\]
看到 \(\gcd\),想到莫比乌斯反演:
\]
记 \(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\) 仍然是非空集合,则有:
\]
\]
\]
\]
\]
\(g(n)\) 的最终推导
根据莫比乌斯反演,有:
\]
带回 \(g(n)\) 中,得:
\]
\]
很好算。时间复杂度 \(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] 最小公倍佩尔数 题解的更多相关文章
- 【BZOJ4833】最小公倍佩尔数(min-max容斥)
[BZOJ4833]最小公倍佩尔数(min-max容斥) 题面 BZOJ 题解 首先考虑怎么求\(f(n)\),考虑递推这个东西 \((1+\sqrt 2)(e(n-1)+f(n-1)\sqrt 2) ...
- BZOJ4833: [Lydsy1704月赛]最小公倍佩尔数(min-max容斥&莫比乌斯反演)(线性多项式多个数求LCM)
4833: [Lydsy1704月赛]最小公倍佩尔数 Time Limit: 8 Sec Memory Limit: 128 MBSubmit: 240 Solved: 118[Submit][S ...
- [Lydsy1704月赛] 最小公倍佩尔数
4833: [Lydsy1704月赛]最小公倍佩尔数 Time Limit: 8 Sec Memory Limit: 128 MBSubmit: 202 Solved: 99[Submit][St ...
- 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 ...
- 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 ...
- 【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 ...
- [bzoj 4833]最小公倍佩尔数
传送门 Description Let \((1+\sqrt2)^n=e(n)+f(n)\cdot\sqrt2\) , both \(e(n)\) and \(f(n)\) are integer ...
- C#版 - Leetcode 504. 七进制数 - 题解
C#版 - Leetcode 504. 七进制数 - 题解 Leetcode 504. Base 7 在线提交: https://leetcode.com/problems/base-7/ 题目描述 ...
- C#版 - Leetcode 306. 累加数 - 题解
版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C#版 - L ...
- C#版(打败97.89%的提交) - Leetcode 202. 快乐数 - 题解
版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C#版 - L ...
随机推荐
- ZCMU-1149
就是背包01问题 #include<iostream> #include<cstring> /*01背包问题*/ using namespace std; const int ...
- 在 .net core 与 .net framework 应用之间共享库
如果你对 .net core 做了任何重要的提交,你就需要为 .net framework 共享同样的库,因为,.net core 是一个新兴的系统生态系统,仍然缺失很多部分. 在混合系统中,你有两个 ...
- 技术实践|Redis基础知识及集群搭建(上)
Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.本篇文章围绕Redis基础知识及集群搭建相关内容进行了分享 ...
- 【转载】Spring Cloud Gateway监控
http://www.imooc.com/article/290822 欢迎加入Spring Cloud Gateway监控豪华套餐-- 只要为Spring Cloud Gateway添加Spring ...
- Qt音视频开发13-视频解码线程基类的设计
一.前言 这个解码线程基类的设计,是到目前为止个人觉得自己设计的最好的基类之一,当然也不是一开始就知道这样设计,没有个三五年的摸爬滚打以及社会的毒打,是想不到要这样设计的,一方面是要不断提炼各种视频类 ...
- 11.14javaweb学习
- [转]Linux系统下的GCC编译过程、使用命令详解(多文件编译、动态库、静态库)
Linux系统下的GCC编译过程.使用命令详解(多文件编译.动态库.静态库) [Linux]gcc简介+编译过程 翻译 搜索 复制
- [转]Vue3.0和Vue2.0的区别
Vue3.0和Vue2.0的区别默认进行懒观察(lazy observation).在 2.x 版本里,不管数据多大,都会在一开始就为其创建观察者.当数据很大时,这可能会在页面载入时造成明显的性能压力 ...
- TypeScript学习(二) - TypeScript的接口(interface)和类(class)
1. 对象的类型--接口 1.1 什么是接口 1.2 简单的例子 1.3 可选属性 1.4 任意属性 1.5 只读属性 2. 类 2.1 类的概念 2.2 ES6 中类的用法 属性和方法 类的继承 存 ...
- Mac_使用allure 生成测试报告
在mac下使用allure 生成测试报告,需要安装软件为: 1. pytest 2. allure-pytest 或者 pytest-allure-adaptor (记住二者只能选其一) 3. all ...