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;
}

浙公网安备 33010602011771号