https://atcoder.jp/contests/abc215/tasks/abc215_d
この問題を解いていたのですが、思いついた解法が計算量的にNGだと思っていたらそれで正解だったみたいです。
一番下のコードが模範解答なのですが、自分的には制限時間以内に終わらないと思っていたため、自分の見積もりのどこが間違っているのか教えてほしいです。
以下自分の計算量見積もり
- 実行制限時間が2秒のためfor 文ループの回数は、2*10^8程度。簡単に考えて10^8。
- 以下の処理において部分部分で大体コメントの通りの計算量のため処理全体で大体 O(N) * O(sqrt(N)) + O(N) * O(NlogN) と見積もる
- Nの最大値を10^5と考え大体の計算でO(10^5) * O(10^2) + O(10^5) * O(10^5)のため、適当に見積もっても(10^10)のため間に合わない
for(int i=0;i<n;i++){ // O(N) int a; cin >> a; vector<int> v=pfact(a); //pfact関数はO(sqrt(N))で終わる for(auto &nx : v){ if(fl[nx]){ for(int j=nx;j<SIZE;j+=nx){fl[j]=false;} //このfor ループはO(NlogN) } } }
ソースコード全体
#include<bits/stdc++.h> #define SIZE 100005 using namespace std; vector<int> pfact(int x){ vector<int> res; for(int i=2;i*i<=x;i++){ while(x%i==0){ x/=i; res.push_back(i); } } if(x!=1){res.push_back(x);} return res; } int main(){ int n,m; cin >> n >> m; vector<bool> fl(SIZE,true); for(int i=0;i<n;i++){ int a; cin >> a; vector<int> v=pfact(a); for(auto &nx : v){ if(fl[nx]){ for(int j=nx;j<SIZE;j+=nx){fl[j]=false;} } } } vector<int> res; for(int i=1;i<=m;i++){ if(fl[i]){res.push_back(i);} } cout << res.size() << '\n'; for(auto &nx : res){cout << nx << '\n';} return 0; }

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。