题面

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

令 \(g(n)\) 表示 \(f(1),f(2)…f(n)\) 的最小公倍数,给定两个正整数 \(n\) 和 \(p\) ,其中 \(p\) 是质数,并且保证 \(f(1),f(2)…f(n)\) 在模 \(p\) 意义下均不为 \(0\) .

请计算\(\displaystyle \sum_{i=1}^{n} i*g(i)\) .其在模 \(p\) 的值。

\(T \le 210, \sum n \le 3 \times 10^6\)

题解

其实它就是给你了 \(f(n)\) 的特征方程,其实可以解出来,具体来说 递推式到通相式 直接待定系数,解回去就把系数代回去就行了。

但是没有必要,\(f(n)\) 是个能打表的东西。
\[ f(n) = \begin{cases} 0, &n = 0 \\ 1, &n = 1 \\ 2f(n - 1) + f(n-2) &\mathrm{otherwise} \end{cases} \]

然后它具有和 \(fib(i)\) 一样的性质, \(\gcd (f(i), f(j)) = f(\gcd(i, j))\) 。

至于证明,可以类似 \(fib(i)\) 的性质证明。

然后考虑最值反演:

不会的话可以看我 这篇博客 。

然后我们可以把这个对于 \(\mathrm{lcm}\) 放到指数上来就是所有指数的 \(\max\) ,那么我们可以用最值反演变成 \(\min\) ,也就是 \(\gcd\) 。

形式如下
\[ \mathrm{lcm}(S) = \prod_{T \subseteq S, T \not = \varnothing} \gcd(T)^{(-1)^{|T|-1}} \]

然后我们利用这个性质进行推导。

\[ \begin{align} g(n) &= \prod_{T \subseteq S, T \not = \varnothing} \gcd_{x \in T}\{f(x)\}^{(-1)^{|T|+1}} \\ &= \prod_{T \subseteq S, T \not = \varnothing} f(\gcd(T))^{(-1)^{|T|+1}}\\ \end{align} \]

然后考虑构造一个函数 \(h\) 满足
\[ f(n) = \prod_{d|n} h(d) \]

由于在模素数意义下,所以必定存在 \(h\) 满足要求。

然后我们考虑每个 \(h(d)\) 的贡献:
\[ \begin{align} \Rightarrow g(n) &= \prod_{d = 1}^{n} h(d)^{\sum_{T\subseteq S, T \not = \varnothing}[d | \gcd(T)](-1)^{|T|+1}} \\ &= \prod_{d = 1}^{n} h(d) \end{align} \]

至于上面那个系数为什么 \(=1\) 呢?可以考虑 \(T\) 集合中所有为 \(d\) 倍数的数构成的所有集合,刚好是 \(2^k - 1\) 的,除去空集,那么剩下的一一抵消,剩下一个 \(1\) 的贡献。

考虑求出 \(h\) 是可以枚举倍数来优化到 \(O(n \ln n)\) 的。

具体来说假设我们 \(<n\) 的所有 \(h\) 都求好了,那么当前的 \(\displaystyle h(n) = f(n) \prod_{d|n, d \not = n} \frac{1}{h(d)}\) 。

其实可以用莫比乌斯反演推回去的,但没必要筛 \(\mu\) 。

那么能不能用线性筛优化到 \(O(n)\) 呢?似乎是不行的,因为 \(h\) 不是积性的,我们知道 \(h(i)\) 与 \(h(p)\) 无法推出 \(h(i \times p)\) 。

然后最后复杂度就是 \(O(\sum n \ln n)\) 的。

总结

对于有些看起来不太好求的 \(\mathrm{lcm}\) 题,考虑最值反演。然后考虑构造积性函数,最后求出积性函数求回来就行了。

代码

/**************************************************************Problem: 4833User: zjp_shadowLanguage: C++Result: AcceptedTime:5908 msMemory:13024 kb
****************************************************************/#include <bits/stdc++.h>#define For(i, l, r) for(register int i = (l), i##end = (int)(r); i <= i##end; ++i)
#define Fordown(i, r, l) for(register int i = (r), i##end = (int)(l); i >= i##end; --i)
#define Set(a, v) memset(a, v, sizeof(a))
#define Cpy(a, b) memcpy(a, b, sizeof(a))
#define debug(x) cout << #x << ": " << (x) << endl
#define DEBUG(...) fprintf(stderr, __VA_ARGS__)using namespace std;typedef long long ll;template<typename T> inline bool chkmin(T &a, T b) {return b < a ? a = b, 1 : 0;}
template<typename T> inline bool chkmax(T &a, T b) {return b > a ? a = b, 1 : 0;}inline int read() {int x(0), sgn(1); char ch(getchar());for (; !isdigit(ch); ch = getchar()) if (ch == '-') sgn = -1;for (; isdigit(ch); ch = getchar()) x = (x * 10) + (ch ^ 48);return x * sgn;
}void File() {
#ifdef zjp_shadowfreopen ("4883.in", "r", stdin);freopen ("4883.out", "w", stdout);
#endif
}const int N = 1e6 + 1e3;int Mod, h[N], g[N], ans[N];ll fpm(ll x, int power) {ll res = 1;for (; power; power >>= 1, (x *= x) %= Mod)if (power & 1) (res *= x) %= Mod;return res;
}void Solve(int maxn) {h[1] = 1;For (i, 2, maxn)h[i] = (h[i - 1] * 2ll + h[i - 2]) % Mod;For (i, 2, maxn) {int inv = fpm(h[i], Mod - 2);for (int j = i * 2; j <= maxn; j += i)h[j] = 1ll * h[j] * inv % Mod;}g[0] = 1; int ans = 0;For (i, 1, maxn) {g[i] = 1ll * g[i - 1] * h[i] % Mod;ans = (ans + 1ll * g[i] * i) % Mod;}printf ("%d\n", ans);
}int main () {File();int cases = read();while (cases --) {int n = read(); Mod = read(); Solve(n);}return 0;}

转载于:https://www.cnblogs.com/zjp-shadow/p/9754566.html

BZOJ 4833: [Lydsy1704月赛]最小公倍佩尔数(数论 + 最值反演)相关推荐

  1. bzoj 4833: [Lydsy1704月赛]最小公倍佩尔数

    链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4833 推推式子,可以得到f(n)=2*f(n-1)+f(n-2) 然后就可以按照这个来做了 ...

  2. BZOJ4833: [Lydsy1704月赛]最小公倍佩尔数-数论

    传送门 题意: 令(1+2–√)n=e(n)+f(n)∗2–√(1+2)n=e(n)+f(n)∗2(1+\sqrt2)^n=e(n)+f(n)*\sqrt2,其中e(n),f(n)e(n),f(n)e ...

  3. 【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 ...

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

    题意 已知\(e_n+\sqrt2f_n=(1+\sqrt2)^n\),\(e_n-\sqrt2f_n=(1-\sqrt2)^n\),\(g_n=lcm_{i=1}^nf_i\),求\(\sum_{i ...

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

    Problem 传送门 Sol 容易得到 fn=en−1+fn−1,en−1=fn−1+en−1,f1=e1=1f_n=e_{n-1}+f_{n-1},e_{n-1}=f_{n-1}+e_{n-1}, ...

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

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

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

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

  8. [数论 反演] BZOJ 4833 最小公倍佩尔数

    当时比赛时灵机一动 把gigi−1g_i\over g_{i-1}喂给了OEIS 然后就找到了 233 就是这个咯 然后就水过去了 题解?题解我还没看 先挖个坑 UPD:跟这个题是一毛一样的咯 #in ...

  9. [bzoj4833][数论][min-max容斥]最小公倍佩尔数

    Description 令(1+sqrt(2))n=e(n)+f(n)*sqrt(2),其中e(n),f(n)都是整数,显然有(1-sqrt(2))n=e(n)-f(n)*sqrt(2).令g( n) ...

最新文章

  1. android设置为存储设备,我可以从格式化为内部存储器的Android SD卡或USB驱动器中恢复数据吗? | MOS86...
  2. 消息队列的使用场景_消息队列MQ的特点、选型及应用场景
  3. 用JQUERY为INPUT的TXT类型赋值及取值操作
  4. 遍历map时删除不需要的元素方法
  5. SOPC自定义外设(IP)的地址对齐
  6. 部署模型之Libtorch学习(一)
  7. 何以笙箫默,一部有剧情的创意广告集?
  8. “完美”解决微信小程序购物车抛物动画,在连续点击时出现计算错误问题,定时器停不下来。
  9. [poj2449]Remmarguts' Date(spfa+A*)
  10. 直流电机PID控制源码c语言,51单片机PID+PWM直流电机转速闭环控制源码(12864液晶显示)...
  11. IP地址-子网掩码-默认网关之间的关系
  12. multienant oracle_OraCleen智能牙刷:您牙齿的高颜值智慧伙伴
  13. 微信小程序识别二维码
  14. 全球与中国消防系统市场现状及未来发展趋势
  15. 学弟想「白嫖」优质大学课,姐直接甩给他 8 个网站
  16. excel解决日期数据无法正常筛选
  17. 设置RecyclerView某Item背景色
  18. WEB网站服务器(一)
  19. 3934:C 10 Aug 2022 00:14:04.239 # Fatal error, can‘t open config file ‘/usr/local/redis/./redis-conf
  20. 美国俚语:down-to-earth踏实谦逊

热门文章

  1. 电子表整点报时怎么取消_歪果仁怎么说“我被放鸽子了”?这可跟鸽子没关系哦...
  2. CSS 特异性 specificity
  3. 宜信研发邮件POP3/SMTP测试
  4. 阿里云推出全球应用加速解决方案,快速提升跨域应用访问体验
  5. 人工智能、机器人、编程啥关系?(科普)
  6. echart雷达图详细配置
  7. 本地idea 调试Hadoop的mr任务(Windows环境)以及对应安装包的下载
  8. python使用matplotlib可视化、自定义设置X轴刻度标签字体的大小( setting axis ticks size in matplotlib x axis)
  9. imvu为什么显示无法连接服务器,IMVU服务器错误怎么办 服务器无法连接解决办法...
  10. (转)云计算的三种模式:IaaS、PaaS和SaaS 通俗理解