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. 无分号js风格注意的三个问题

    建议如果一行代码是以   (   [   `  开头的,则最好都在其前面补上一个分号. // 1.( function say() { console.log('hello world') } // ...

  2. Android 国际化:新增越南语语系(Java)

    前提: 1. 在res文件夹中,新增values-vi文件夹(越南语文件夹) 2. 在步骤1的文件夹中,新增strings.xml 背景: 1. targetSdkVersion 29 2. Jdk ...

  3. vue grid layout 设定某组件为最低位,其它子item无法拖拽超过

    逻辑:    设定某项X为底部    逻辑:    for 循环获取最低位的item Y的信息:i 和 y    如果i != X.i        initY = X.y        则调整X.y ...

  4. nftables

    RHEL 8 用 ntftable 替换 iptables, 新安装的 CentOS 8.3 是这样的: [root@net182-host113 ~]# nft list tablestable i ...

  5. Splay/LCT 学习笔记

    唔,其实我不会 Splay,但是我会 LCT. 众所周知,会 LCT 和会 Splay 是两回事,因为 LCT 只需要旋至根即可. 到现在还是不会,但是先把 LCT 的 Splay 写一下吧. 自己复 ...

  6. Go runtime 调度器精讲(一):Go 程序初始化

    原创文章,欢迎转载,转载请注明出处,谢谢. 0. 前言 本系列将介绍 Go runtime 调度器.要学好 Go 语言,runtime 运行时是绕不过去的,它相当于一层"操作系统" ...

  7. JS常见的API扩展形式(prototype、jquery、vue插件封装)以及怎样设计出易扩展的表单验证功能?

    常见的API扩展形式 prototype 比如我现在有一个需求,给定一个字符串,给方法传递一个参数为数字类型来确定当前字符串重复次数,例如: 'abc'.repeatStringNumTimes(3) ...

  8. Naive UI 2.38.1

    https://www.naiveui.com/zh-CN/os-theme/docs/i18n 配置字体 Naive UI 可以和 vfonts 配合,你可以简单的引入 vfonts 中的字体,包含 ...

  9. 仿Linux内核链表实现合并有序链表、逆序单链表功能,C版本 JavaScript版本

    直接贴上已经码好的: list_sort.c: #include <stdio.h> #include <string.h> #include <assert.h> ...

  10. 阿里面试让聊一聊Redis 的内存淘汰(驱逐)策略

    大家好,我是 V 哥,粉丝小A面试阿里,说被问到 Redis 的内存淘汰策略的问题,整理这个笔记给他参考,也分享给大家,如果你遇到这个问题,会怎么回答呢? Redis 的内存淘汰策略是指当Redis的 ...