Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 백준
- Javascript
- 풀이
- 드림핵
- Python
- lob
- siss
- Sookmyung Information Security Study
- PHP 웹페이지 만들기
- 웹페이지 만들기
- c++
- WarGame
- 생활코딩
- XSS Game
- The Loard of BOF
- 숙명여자대학교 정보보안 동아리
- BOJ
- CSS
- BOJ Python
- C언어
- 머신러닝
- c
- 숙명여자대학교 정보보안동아리
- hackctf
- SWEA
- HTML
- 자료구조 복습
- hackerrank
- 파이썬
- 기계학습
Archives
- Today
- Total
혜랑's STORY
[BOJ_C++] 1016번 : 제곱 ㄴㄴ 수 본문
# 문제
# 풀이
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <algorithm>
#include <cstring>
#include <stack>
#include <vector>
#include <cmath>
using namespace std;
bool num[1000001];
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
memset(num, false, sizeof(num));
long long min, max;
int cnt = 0;
cin >> min >> max;
for (long long i = 2; i <= sqrt(max); i++) {
long long n = min / (i * i);
if (min % (i * i)) n++;
while (n * i * i <= max) {
num[n * i * i - min] = true;
n++;
}
}
for (int i = 0; i <= max - min; i++)
if (num[i] == false) cnt++;
cout << cnt;
return 0;
}
- 에라토스테네스의 체의 원리를 응용하여 문제를 해결하였다.
- 먼저 max와 min 사이에 있는 최대의 수가 1000000이므로 이 결과를 저장할 bool 배열을 1000001 크기로 만들고 모두 false로 초기화 해 주었다.
- max보다 작은 제곱근들에 대해 배수를 늘려가며 해당 범위에 들어가는지 체크하고 들어가면 true로 값을 바꿔준다.
- 이때 n*i*i는 min보다 크거나 같은 i의 제곱수의 배수이다.
# 결과
'무지성 공부방 > 알고리즘 해결' 카테고리의 다른 글
[BOJ_C++] 2805번 : 나무 자르기 (0) | 2021.07.26 |
---|---|
[BOJ_C++] 1759번 : 암호만들기 (0) | 2021.07.21 |
[BOJ_C++] 5576번 : 콘테스트 (0) | 2021.07.20 |
[BOJ_C++] 2628번 : 종이자르기 (0) | 2021.07.20 |
[BOJ_C++] 2456번 : 나는 학급회장이다 (0) | 2021.07.20 |