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

题解

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

首先,对整个序列划分轮换,不就是将其分为 \(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;
}

[ATCoder] Cyclic GCDs - 神圣的数学题的更多相关文章

  1. Cyclic GCDs

    Cyclic GCDs 题目链接 题面描述 有\(n\)个点,每个点有权值. 现有排列\(P\),\(p_i\)表示\(i\)个点向\(p_i\)连了一条边. 显然会形成若干个简单环.每个简单环的权值 ...

  2. 【AtCoder】Dwango Programming Contest V题解

    A - Thumbnail 题意简述:给出N个数,找出N个数中和这N个数平均值绝对值最小的数 根据题意写代码即可= = #include <bits/stdc++.h> #define f ...

  3. 2018.07.20 atcoder Largest Smallest Cyclic Shift(贪心)

    传送门 题意:给你x个a,y个b,z个c,显然这些字符可以拼成若干字符串,然后求这些字符串中最小表示法表示出来的最大的那一个. 解法:贪心思想,用multiset维护现在拼成的字串,每次取一个最小的和 ...

  4. [Atcoder Code Festival 2017 Qual B Problem F]Largest Smallest Cyclic Shift

    题目大意:给你\(A\)个a,\(B\)个b,\(C\)个c,要你构造一个字符串,使它的最小循环表示法最大.求这个表示法.解题思路:不知道怎么证,但把a.b.c当做单独的字符串扔进容器,每次把字典序最 ...

  5. AtCoder 杂题训练

    前言: 因为要普及了,今年没一等就可以退役去学文化课了,所以暑假把历年noip普及组都刷了一遍,离noip还有50+天,想弄点强化训练什么的. 想了想,就这些天学文化课之余有空就把AtCoder之前那 ...

  6. Largest Smallest Cyclic Shift

    Largest Smallest Cyclic Shift 题目来源: Atcoder Code Festival 2017 Qual B Problem F 题目大意: 有\(X\)个字符'a',\ ...

  7. ytu 2558: 游起来吧!超妹!(水题,趣味数学题)

    2558: 游起来吧!超妹! Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 7  Solved: 3[Submit][Status][Web Board ...

  8. Codeforces Round #385 (Div. 2) A. Hongcow Learns the Cyclic Shift 水题

    A. Hongcow Learns the Cyclic Shift 题目连接: http://codeforces.com/contest/745/problem/A Description Hon ...

  9. codeforces 709C C. Letters Cyclic Shift(贪心)

    题目链接: C. Letters Cyclic Shift 题意: 现在一串小写的英文字符,每个字符可以变成它前边的字符即b-a,c-a,a-z这样,选一个字串变换,使得得到的字符串字典序最小; 思路 ...

  10. sdut 2416:Fruit Ninja II(第三届山东省省赛原题,数学题)

    Fruit Ninja II Time Limit: 5000MS Memory limit: 65536K 题目描述 Have you ever played a popular game name ...

随机推荐

  1. k8s Deployment与Service配置样例

    一.Deployment apiVersion: apps/v1 kind: Deployment metadata: name: pie-algorithm-farmland-detection s ...

  2. win指令学习收集

    要执行多句,需要用到逻辑判断 1 & 2 1成不成功都会执行2 1 && 2 1成功才会执行2 1 || 2 1不成功才会执行2

  3. Windows 包管理器

    WinGet WinGet 是微软官方的软件管理器. 搜索 WinGet 包 常用命令 winget install <packaeg> # 安装包 winget uninstall &l ...

  4. LaViT:这也行,微软提出直接用上一层的注意力权重生成当前层的注意力权重 | CVPR 2024

    Less-Attention Vision Transformer利用了在多头自注意力(MHSA)块中计算的依赖关系,通过重复使用先前MSA块的注意力来绕过注意力计算,还额外增加了一个简单的保持对角性 ...

  5. keycloak~scope客户端模板的使用

    scope为何物? scope在oauth2中表示授权的范围,另外也可以理解为,根据认证时scope的参数,在构建jwt时,返回更多的信息:比如在keycloak中,你的可选scope(optiona ...

  6. 2024 秋季PAT认证甲级(题解A1-A4)

    2024 秋季PAT认证甲级(题解A-D) 写在前面 这一次PAT甲级应该是最近几次最简单的一次了,3个小时的比赛差不多30分钟就ak了(也是拿下了整场比赛的rk1),下面是题解报告,每个题目差不多都 ...

  7. Angular 学习笔记 language service

    尝试 v10 rc 的时候, 突然 language service 不 work 了. ctrl + shift + p -> Show logs... 这样可以检查和 report issu ...

  8. Identity – Custom Entity

    扩展属性 Custom Entity 指的是我们想对 Identity 的几个 Entity 做修改. 比如 User 要多一些 property, 或者 Id 用 int 而不是默认的 GUID. ...

  9. CMake构建学习笔记16-使用VS进行CMake项目的开发

    目录 1. 概论 2. 详论 2.1 创建工程 2.2 加载工程 2.3 配置文件 2.4 工程配置 2.5 调试执行 3. 项目案例 4. 总结 1. 概论 在之前的系列博文中,我们学习了如何构建第 ...

  10. MySQL及navicat安装破解

    一.Navicat Premium15 下载安装包和破解工具 1.Navicat官网下载地址:http://www.navicat.com.cn/download/navicat-premium 2. ...