3問早解きでまぁまぁよかった回。
http://codeforces.com/contest/1349/problem/A
問題
N要素の整数列Aが与えられる。
2要素のLCMを列挙したとき、その全体のGCDを求めよ。
解法
素因数p毎に考える。
LCMを素因数分解したときのpの位数の最小値を考えると、A中で2番目のものとなる。
そこでpの倍数となる数だけ見て行けばよい。
int N; int A[202020]; const int prime_max = 200000; vector<int> prime; int NP,divp[prime_max]; void cprime() { if(NP) return; for(int i=2;i<prime_max;i++) if(divp[i]==0) { //M[i]=NP; prime.push_back(i); NP++; for(ll j=1LL*i*i;j>=i&&j<prime_max;j+=i) if(divp[j]==0) divp[j]=i; } } void solve() { int i,j,k,l,r,x,y; string s; cprime(); cin>>N; FOR(i,N) { cin>>x; A[x]++; } ll ret=1; FORR(p,prime) { vector<int> V; int sum=0; for(x=p;x<=200000;x+=p) if(A[x]) { y=x; r=0; while(y%p==0) y/=p, r++; FOR(j,A[x]) { V.push_back(r); } sum+=A[x]; } if(N-sum>=2) continue; FOR(i,min(2,N-sum)) V.push_back(0); sort(ALL(V)); int mi=max(V[0],V[1]); FOR(j,mi) ret*=p; } cout<<ret<<endl; }
まとめ
この回Cまでは簡単だったっぽいね。