문제1.
- 2부터 N까지의 숫자 중에서 소인수의 최댓값이 M이하인 숫자의 갯수를 구하세요.
- N의 범위가 매우 작았던 것 같다.
#include <iostream>
using namespace std;
int n, m, ans;
int getMax(int n) {
int maxVar = 0;
for (int i = 2; i <= n; ++i) {
while(n % i == 0){
n /= i;
if (maxVar < i) maxVar = i;
}
}
return maxVar;
}
int main() {
cin >> n >> m;
for (int i = 2; i <= n; ++i) {
if (getMax(i) <= m) ++ans;
}
cout << ans << '\n';
return 0;
}
문제2.
- N <= X <= M인 모든 소수 X의 합을 구하세요. (M <= 20만)
- 범위가 큰 소수 >> 에라토스테네스의 체
- 이 문제를 대신 풀어도 될 것 같다.
2581번: 소수
M이상 N이하의 자연수 중 소수인 것을 모두 찾아 첫째 줄에 그 합을, 둘째 줄에 그 중 최솟값을 출력한다. 단, M이상 N이하의 자연수 중 소수가 없을 경우는 첫째 줄에 -1을 출력한다.
www.acmicpc.net
#include <iostream>
#define MAX 10001
using namespace std;
int n, m;
long long ans;
int isNotPrime[MAX];
void getPrime(int n, int m) {
long long sum = 0;
isNotPrime[1] = 1;
for (int i = 2; i <= m; ++i) {
for (int j = i + i; j <= m; j += i) {
isNotPrime[j] = 1;
}
}
bool find = false;
int minPrime;
for (int i = n; i <= m; ++i) {
if (isNotPrime[i] == 0) {
if(!find) minPrime = i, find = true;
sum += i;
}
}
if (sum == 0) cout << -1 << '\n';
else cout << sum << '\n' << minPrime << '\n';
return;
}
int main() {
cin >> n >> m;
getPrime(n, m);
return 0;
}
문제3.
- 해당 문제 대신, 백준 N과M 문제를 다풀어보면 될 것 같다.
문제집: N과 M (baekjoon)
www.acmicpc.net
'알고리즘 > BOJ(백준)' 카테고리의 다른 글
[ 백준 - 3024 / 구현 ] 마라톤 틱택토 (0) | 2020.05.22 |
---|---|
[ 백준-18808번 / 구현 ] 스티커 붙이기 (0) | 2020.05.21 |
[ 백준 - 14501번 / DP / 완전 탐색 ] 퇴사 (0) | 2020.05.11 |
[ 백준 - 1697 / BFS ] 숨바꼭질 (0) | 2020.05.11 |
[ 백준 - 14500번 / 구현 ] 테트로미노 (삼성기출) (0) | 2020.05.11 |