AT_dwacon5th_prelims_e

可能更好的阅读体验

模拟赛笑传之满分外最高分为 20 分。

题意:给定一个长为 \(n\) 的正整数序列 \(a\),长度为 \(n\) 的排列 \(p\) 的价值为 \(p\) 中每个置换环中最小的 \(a_i\) 之积。设 \(b_i\) 为有 \(i\) 个置换环的所有排列 \(p\) 的价值之和,求 \(\gcd_{i=1}^{n}b_i\bmod 998244353\)\(1\le n\le 10^5\)\(1\le a_i\le 10^9\)

注意到顺序是无关的,于是按照从小到大的顺序排序,这样一个置换环中最小的 \(a_i\) 就和最小的 \(i\) 对应了。

考虑 DP,设 \(f_{i,j}\) 为前 \(i\) 个数构成 \(j\) 个置换环时的价值和。

转移考虑是否创建了新的环,有 \(f_{i,j}=a_if_{i-1,j-1}+(i-1)f_{i-1,j}\)

但是这样是 \(O(n^2)\) 的,而且因为要求 gcd 所以不能取模。

考虑 \(f_i\) 的生成函数 \(F_i(x)=\sum f_{i,j}x^j\),有 \(F_i(x)=(a_ix+i-1)F_{i-1}(x)\),即 \(F_n(x)=\prod(a_ix+i-1)\)

发现可以先提出 \(\prod \gcd(a_i,i-1)\),然后不会了。但是测样例发现这个是对的,于是开拍,直到结束一共拍了十万多组,最后过了。证明考虑高斯引理:本原多项式的乘积仍然是本原多项式。

高斯引理证明:

设有两个本原多项式 \(f(x)=\sum A_ix^i,g(x)=\sum B_ix^i\),并令 \(h(x)=f(x)g(x)=\sum C_ix^i\)

反证法,若 \(h(x)\) 不是本原多项式,令 \(p\) 为能够整除 \(h(x)\) 所有系数的某质数,\(A_i\)\(f(x)\) 中第一个不被 \(p\) 整除的系数,\(B_j\)\(g(x)\) 中第一个不被 \(p\) 整除的系数。

\(C_{i+j}=\sum_d A_{i+d}B_{j-d}\),由假设知 \(p\mid C_{i+j},p\mid \sum_{d\neq0} A_{i+d}B_{j-d},p\nmid A_iB_j\),因此矛盾。

证毕。

#include<bits/stdc++.h>
using namespace std;
namespace ax_by_c{
typedef long long ll;
const int mod=998244353;
const int N=1e5+5;
int n,a[N];
void main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++)scanf("%d",&a[i]);
    sort(a+1,a+1+n);
    int ans=a[1]%mod;
    for(int i=2;i<=n;i++)ans=(ll)ans*__gcd(a[i],i-1)%mod;
    printf("%d\n",ans);
}
}
int main(){
    ax_by_c::main();
    return 0;
}
posted @ 2025-02-25 17:23  ax_by_c  阅读(24)  评论(0)    收藏  举报