4833: [Lydsy2017年4月月赛]最小公倍佩尔数 数论变换
来源:互联网 发布:arduino图形化编程 编辑:程序博客网 时间:2024/06/14 02:55
先吐槽一下:唐老师下标全崩了,最重要的后面的一坨推导全都挂了qwq,我推到倒数第二步然后和题解一对发现我好想全推错了233333? 最后还是找的A了的zyz才弄明白他写的是什么
这题和一道斐波那契公倍数比较像,先说这个吧
先考虑给你的那个式子,你上面减下面再移个项就变成通项公式了
然后通过特征根/观察/打表你get了这个递推式是
观察这个递推式的性质,首先我们能够得到
然后考虑
然后我们get了一个非常关键的结论是
证明的话考虑一种让
此时
前面那项显然可以直接去掉了,因为是
那么剩下的是
注意到
所以他等于
现在可以考虑
考虑
然后我们子集反演一下就得到了
注意到
一个经典思路考虑构造数列
把这个带进去就有
考虑直接枚举一个
这个是怎么来的呢?考虑这样一个事情,对于一个元素来说他被选择而且是
所以一个元素总的贡献就是
但是注意到前面是符号所以是减去这个贡献还有空集,空集的贡献就是1,所以就有了上面的那个式子了
然后考虑后面那个东西在
那么
通过广义莫比乌斯反演我们可以知道他等于同等运算在mu意义下的逆运算
问题完美解决,时间复杂度
#include <stdio.h>#include <string.h>#include <iostream>#include <algorithm>using namespace std;const int N = 1e6+5;int prime[N], cnt, mu[N];bool F[N];typedef long long LL;inline int pow(int a,int b,int mod) { LL res = 1; for(;b;b>>=1,a=(LL)a*a%mod) if(b&1) res = res * a % mod; return res;}inline void init() { const int Max = 1e6; mu[1] = 1; for(int i=2;i<=Max;++i) { if(!F[i]) mu[i] = -1, prime[++cnt] = i; for(int j=1;prime[j]*i<=Max;++j) { F[i*prime[j]] = 1; if(i%prime[j]==0) break; mu[i*prime[j]] = -mu[i]; } }}int f[N], h[N], g[N], inv[N];int main() { int T; cin >> T; init(); while(T--) { int Max, mod; cin >> Max >> mod; f[1] = 1, f[2] = 2; register int i; int x; for(i=3;i<=Max;++i) f[i] = (2ll * f[i-1] + f[i-2]) % mod; for(i=1;i<=Max;++i) h[i] = 1; for(i=1;i<=Max;++i) inv[i] = pow(f[i], mod-2,mod); for(int d=1;d<=Max;++d) { for(i=1;i*d<=Max;++i) { x = i * d; if(mu[i] == 1) h[x] = (LL) h[x] * f[d] % mod; else if(mu[i] == -1) h[x] = (LL) h[x] * inv[d] % mod; } } for(i=2;i<=Max;++i) h[i] = (LL) h[i] * h[i-1] % mod; for(i=1;i<=Max;++i) g[i] = h[i]; LL ans = 0; for(i=1;i<=Max;++i) ans = (ans + (LL) g[i] * i % mod) % mod; cout << ans << endl; }}
- 4833: [Lydsy2017年4月月赛]最小公倍佩尔数 数论变换
- 4833: [Lydsy2017年4月月赛]最小公倍佩尔数
- [Lydsy2017年4月月赛]抵制克苏恩
- [Lydsy2017年4月月赛]抵制克苏恩
- BZOJ4832 [Lydsy2017年4月月赛]抵制克苏恩
- BZOJ4835 [Lydsy2017年4月月赛]遗忘之树
- BZOJ4836 [Lydsy2017年4月月赛]二元运算
- BZOJ 4801([Lydsy2017年4月月赛]打牌-分类讨论)
- [BZOJ]4832: [Lydsy2017年4月月赛]抵制克苏恩
- BZOJ4837 [Lydsy2017年4月月赛]LRU算法
- 4836: [Lydsy2017年4月月赛]二元运算
- 4835: [Lydsy2017年4月月赛]遗忘之树
- 4831: [Lydsy2017年4月月赛]序列操作
- bzoj 4831: [Lydsy2017年4月月赛]序列操作
- 概率DP [Lydsy2017年4月月赛]抵制克苏恩
- [bzoj-4832][Lydsy2017年4月月赛]抵制克苏恩 题解
- bzoj4885: [Lydsy2017年5月月赛]长方体
- BZOJ4885: [Lydsy2017年5月月赛]长方体
- 事件绑定、事件监听、事件委托
- spark完全分布式安装
- 矩阵连乘(java)
- android 加载assets下图片,手势放大缩小
- 微信小程序与公众号卡券/会员打通
- 4833: [Lydsy2017年4月月赛]最小公倍佩尔数 数论变换
- Advice from Zed A. Shaw.
- 最优二叉搜索树(java)
- 编译webrtc for android库与apk
- Java继承浅析思考
- java 遍历map
- JAVA如何把一个float四舍五入到小数点后2位,4位,或者其它指定位数.
- 作业
- MYSQL秒杀的处理