Cyclic GCDs - 神圣的数学题

news/2024/10/21 21:30:33

Cyclic GCDs

题面

【题目描述】

给定一个长为 \(N\) 的序列 \(a_1,a_2,\dots,a_N\)

设一个置换 \(p\) 的价值 \(f(p)\) 为每个轮换中最小的 \(a_i\) 的乘积。

\(b_i\) 为有 \(i\) 个轮换的所有置换 \(p\)\(f(p)\) 之和。

\(\gcd(b_1,b_2,\dots,b_N) \bmod{998244353}\)

【数据范围】

\(1\le N\le10^5\)\(1\le a_i\le10^9\)

【样例输入】

4
2 5 2 5

【样例输出】

2

bdd8ce0a7db3b4f920b04551c60aa207.png

题解

抽象的证明,美妙的公式,好一道数学题。

首先,对整个序列划分轮换,不就是将其分为 \(k\) 个不交集合吗?

其次,要求每个集合中的最小值,不就等于将序列从小到大排序后取划分左端点吗?

如此,我们考虑一个函数 \(F_{i,j}\) 表示前 \(i\) 个数划分为 \(j\) 个集合的价值之积的和,则 \(F_{n, i} = b_i = \sum f(p)\),有如下式子:

\[F_{i,j} = a_i \times F_{i-1,j-1} + (i - 1) \times F_{i-1,j} \]

  • 如果新加入一个数,自成一个轮换,那么对 \(f(p)\) 贡献一个 \(a_i\) 的乘积,我们得到了 \(a_i \times F_{i-1,j-1}\) 这个式子。

  • 如果新加入一个数,插入其他轮换,那么前面 \(i - 1\) 个数有 \(i - 1\) 个位置可供插空,则对 \(b_i\) 贡献一个所有满足条件的置换之和,我们得到了 \((i - 1) \times F_{i-1,j}\) 这个式子。

这个式子和斯特林数十分相似,我们考虑引入 \(G_i(x) = \sum\limits_{j = 0}^n F_{i,j}x^i\) 这个生成函数。

明显的,我们可以使用形式幂级数代换原递推式得到:

\[[x^j]G_i(x) = [x^{j-1}]a_iG_{i-1}(x) + [x^{j}](i - 1)G_{i-1}(x) \]

根据幂形式的性质,给 \(j-1\) 次项乘上 \(x\) 可以得到等幂式,又可以缩回我们的生成函数,即:

\[\begin{aligned} G_i(x) &= a_ixG_{i-1}(x) + (i - 1)G_{i-1}(x)\\ &= (a_ix + i - 1)G_{i-1}(x) \end{aligned} \]

\(G_n(x)\) 便是我们需要求得的 \(n\)\(j\) 次划分贡献的生成函数。

于是我们有:

\[\begin{aligned} G_n(x) &= (a_nx + n - 1)G_{n-1}(x)\\ &= (a_nx + n - 1)(a_{n-1}x + n - 2)G_{n-2}(x)\\ &= (a_nx + n - 1)(a_{n-1}x + n - 2)...(a_2x - 1)a_1\\ &= \prod_{i = 1}^n (a_ix + i - 1) \end{aligned} \]

\(b_i = [x^i]G_n(x)\),我们想求 \(\gcd(b_1,b_2,...,b_n) = \gcd\limits_{i = 1}^n [x^i]G_n(x)\),很自然的联想到在 \(G_n(x)\) 上下手。

\(m = \gcd\limits_{i = 1}^n [x^i]G_n(x)\)

我们考虑将其因式分解,有 \(G_n(x) = m(c_1x + d_1)(c_2x + d_2)...(c_nx + d_n)\)

对于任一 \([x^i]G_n(x)\),我们总能得到 \(m \times P\)\(P\) 为不能再分解的因式,因此我们得到 \(\gcd(b_1,b_2,...,b_n) = m\)

而根据 \(m = \prod\limits_{i=1}^n \gcd(a_i, i - 1)\),我们得出结论:

\[\gcd(b_1,b_2,...,b_n) = \prod\limits_{i=1}^n \gcd(a_i, i - 1) \]

#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10, mod = 998244353;
int n, a[N], ans = 1;
int main()
{cin >> n;for (int i = 1; i <= n; i ++ ) cin >> a[i];sort(a + 1, a + n + 1);for (int i = 1; i <= n; i ++ ) ans = 1ll * ans * __gcd(a[i], i - 1) % mod;cout << ans;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/74361.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

『模拟赛』多校A层冲刺NOIP2024模拟赛10

『模拟赛记录』多校A层冲刺NOIP2024模拟赛10Rank 原来不止我一个人在赤石 Upd:T2 数据多次更改,Rank 变化 4→2→4A. 岛屿 唐氏题。 赛时找规律+分讨+递推出了正解,时间不够没测直接交了,然后 long double 用了 %lf 直接寄掉。赛时思路很复杂啊,讨论了一大堆,发现其实合并…

单射,满射和双射区分

单射: 定义:函数F称为一对一的,当且仅当对于F定义域中的所有x和y,f(x)=f(y)蕴含着x=y。一对一函数也称单射函数或入射函数1.x一定都要连接,不连接则不是函数 2.y只能有一个连接,可以为空但是不能有多个 错误情况:满射 定义:给定函数F:x→y,当且仅当对∀y∈Y,都有x∈X…

20240917【省选】模拟

难说 T1 暴力可以写dp 只要你学过线性基那么你就会想怎么用线性基做,显然是要套点数据结构维护的。你要知道两个线性基可以在 \(O(\log^2 n)\) 的时间内合并,得到的线性基是原来两个的交。可以用线段树维护,复杂度 \(O((n+q)\log n\log^2 a)\),难说能不能过。 没有修改,所…

高级语言程序设计课程第四次个人作业

班级:https://edu.cnblogs.com/campus/fzu/2024C 作业:https://edu.cnblogs.com/campus/fzu/2024C/homework/13293 学号:102400118 姓名:林嘉祚 6.16.16.16.56.16.76.16.86.16.96.16.106.16.126.16.136.16.156.16.166.16.187.12.17.12.27.12.47.12.57.12.67.12.77.12.87.12.97…

2024Ciscn总决赛Web Writeup

前言 鸽了三个月的复现计划:) ezjs 考点是express引擎解析的一个trick,在高版本的express已经修复,先贴源码 const express = require(express); const ejs=require(ejs) const session = require(express-session); const bodyParse = require(body-parser); const multer =…

C# 新建的类库无法添加 System.Drawing 引用问题

C#类库添加System.Drawing引用时,选择程序集 -> 框架 -> 再搜索对应的库,添加引用就可以了。不要在COM中搜索。

20222420 2024-2025-1 《网络与系统攻防技术》实验二实验报告

20222420 2024-2025-1 《网络与系统攻防技术》实验二实验报告 1.实验内容 1.1 本周学习内容 1.1.1 后门介绍后门概念:不经过正常认证流程而访问系统的通道 后门类型:编译器、操作系统、应用程序中的后门,潜伏于OS或伪装成APP的后门程序1.1.2 后门案例编译器后门:Xcode 操作…

tms fnc ui

tms fnc uitms fnc ui 这组界面控件,支持DELPHI的VCL和FMX,还支持FPC的LCL。 1)TTMSFNCNavigationPanel2)TTMSFNCTileList3)本文来自博客园,作者:{咏南中间件},转载请注明原文链接:https://www.cnblogs.com/hnxxcxg/p/18490245