-
에라토스테네스의 체 구현BOJ 2024. 7. 23. 16:48
for(int i = 2; i*i <= n; i++){ if(!visit[i]) continue; for(int j = i*i; j <=n; j+=i){ visit[j] = false; } } for(int i = 2; i <= n; i++) if(visit[i]) prime.push_back(i);원래는 에라토스테네스의 체를 위처럼 구현했다. 불필요한 연산 같아서 위의 for 문에서 i*i 를 i 로 바꾸면 출력이 안됐다.
왜 안되는지 고민하다가 백준에 넣어보니까 int overflow가 발생함을 알 수 있었다....
그래서 long long 형으로 바꿔주니까 잘 작동한다.
void sieve(int n){ vector<bool> visit(n+1,1); for(long long i = 2; i <= n; i++){ if(!visit[i]) continue; for(long long j = i*i; j <=n; j+=i){ visit[j] = false; } prime.push_back(i); } }근데 뭐가 더 효율적인지는 모르겠음
시간 초과나는 코드에 넣어도 똑같이 시간초과나고..
'BOJ' 카테고리의 다른 글
길이가 n^2 인 서로 다른 수의 수열에서 LIS or LDS 가 n+1 이지 않은 수열 구하기 (5) 2024.12.10 2024 ICPC Seoul Regional 후기 (0) 2024.11.27 Easy Problem (1) 2024.11.16 power tower 를 오일러 정리 적용하여 계산하기. (1) 2024.10.29 오일러 피(phi)함수를 거듭 연산했을 때 몇 번에 0이 되는가 ? (4) 2024.10.28