[LuoguP1414]又是毕业季II

sshwy

2019-03-04 14:16:14

Personal

# 分析 题目难点在于利用答案的单调性,显然$k$越小,$gcd$越大。 考虑记录每一个因数出现的次数,再用次数多的因数来更新次数少的因数(取$max$). 复杂度$O(n\sqrt n)$. # 代码 ```cpp #include<cstdio> #include<algorithm> using namespace std; const int N=10004,MXA=1000006; int n,a,mxa; int t[MXA],p[N]; int main(){ scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d",&a); mxa=max(mxa,a); for(int j=1;j*j<=a;j++){ if(j*j==a)t[j]++; else if(a%j==0)t[j]++,t[a/j]++; } } for(int i=1;i<=mxa;i++)p[t[i]]=i; //相同出现次数,大的因数会自动把小的因数更新掉 for(int i=n-1;i>=1;i--)p[i]=max(p[i],p[i+1]); //次数多的因数来更新次数少的因数 for(int i=1;i<=n;i++)printf("%d\n",p[i]); return 0; } ```