恋兔光
takanashi_mifuru · · 题解
不要猜结论!不要生成函数!
生成函数马上就要变成十级算法了,怎么还在学这种鬼东西?
轮换不好做,考虑变成集合,假设有若干个集合,那么一个集合就可以贡献
也就是说,假设现在有一个大小为
那你设
考虑把这个东西的图像画出来,容易发现最后
如果要求和还要 gcd 十分不牛,如果能把
于是我们大胆猜想,我们一定能够使用某一条路径卡死 gcd 的其中一个因子。
首先是正确性,考虑我们枚举质因数
然后还是正确性,考虑为什么这条路径一定能够严到,
然后我们就证明了,我们的答案一定会卡死 gcd,然后这个题就做完了,生成函数是什么????????????????????????????????
附上无敌优美代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n;
int A[1000005];
const int P=998244353;
bool flg[1000005];
int getcnt(int x,int y){
int cnt=0;
while(x%y==0)x/=y,cnt++;
return cnt;
}
signed main(){
scanf("%lld",&n);
for(int i=1;i<=n;i++){
scanf("%lld",&A[i]);
}
sort(A+1,A+1+n);
int ans=1;
for(int d=2;d<n;d++){
if(flg[d])continue;
int all=0;
for(int j=1;j*d<n;j++){
flg[j*d]=true;
int tmp1=getcnt(j*d,d);
int tmp2=getcnt(A[j*d+1],d);
all+=min(tmp1,tmp2);
}
while(all--)ans=ans*d%P;
// ans=ans*power(d,all)%P;
}
printf("%lld\n",ans*A[1]%P);
return 0;
}