반응형
https://www.acmicpc.net/problem/1016
1016번: 제곱 ㄴㄴ 수
어떤 정수 X가 1보다 큰 제곱수로 나누어 떨어지지 않을 때, 그 수를 제곱ㄴㄴ수라고 한다. 제곱수는 정수의 제곱이다. min과 max가 주어지면, min보다 크거나 같고, max보다 작거나 같은 제곱ㄴㄴ수
www.acmicpc.net
[ 문제풀이 ]
1. 최솟값과 최댓값을 입력받습니다.
2. 구해야 하는 수의 범위가 최대 1,000,000이기 때문에 arr [ 1000001 ] 배열을 만들어서 각 숫자의 제곱 ㄴㄴ 수 여부를 판별합니다.
3. 범위 내 수의 개수를 ans에 대입합니다.(Max - Min + 1)
4. i = 2부터 for문을 돌며 i * i <= Max까지 i를 증가시키면서 그 배수에 Min을 뺀 값 즉, arr [ i * i * j - Min ]을 1로 바꿔주고, ans에 1을 빼줍니다.
5. 위의 과정 4에서 시작하는 j값을 얻기 위해 Min / i * i를 통해 나온 몫의 값에 나머지가 없다면 0을 나머지가 있다면 1을 더해줍니다.
6. ans를 출력해줍니다.
[ 소스코드 ]
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 | #include<iostream> #define ll long long using namespace std; ll arr[1000001]; ll Min, Max; int ans; int main() { scanf("%lld %lld", &Min, &Max); ans = Max - Min + 1; //범위 내 모든 수의 개수 for (ll i = 2; i * i <= Max; i++) { ll pow = i * i; //제곱수 ll cnt = Min / pow; //범위 내 나누어 떨어지는 수의 최솟값 if (Min % pow) cnt++; //나누어 떨어지지 않으면 몫 + 1 for (ll j = cnt; j*pow <= Max; j++) { if (arr[j * pow - Min] != 1) { arr[j * pow - Min] = 1; ans--; } } } printf("%lld", ans); } | cs |
반응형
'백준' 카테고리의 다른 글
[ 백준 ] 1600번 - 말이 되고픈 원숭이 (C++) (0) | 2022.12.09 |
---|---|
[ 백준 ] 16393번 - Lost Map (C++) (0) | 2022.12.08 |
[ 백준 ] 6091번 - 핑크 플로이드 (C++) (0) | 2022.12.06 |
[ 백준 ] 5427번 - 불 (C++) (0) | 2022.12.05 |
[ 백준 ] 4179번 - 불! (C++) (0) | 2022.12.04 |