1. ๋ฌธ์ ์ค๋ช ๐
2. ๊ตฌํ ๋ฐฉ๋ฒ ๐๏ธ
KEY WORD
: ์๋ผํ ์คํ
๋ค์ค์ ์ฒด
๋ฌธ์ ์์ ์ฃผ์ด์ง ์์ญ์ ์ต์๊ฐ A
, ์ต๋๊ฐ B
, ์์์ ์์ K
์ ๋ํ์ฌ, $A < K^(n) < B$ ๊ฐ ์ฑ๋ฆฝํ๋ $K^{n}$์ ๊ฐ์๋ฅผ ์ธ๋ผ๋ ๋ฌธ์ ์ด๋ค. B์ ์ต๋๊ฐ์ $10^{14}$์ด๋ค. java์ long ์๋ฃํ์ ์ต๋๊ฐ์ด $10^{18}$์ด์ง๋ง, ์ ๊ณฑ์ ๊ตฌํ๋ค๋ ๋ฉด์์ $K^{n}$์ด $10^{18}$์ ํ์ฉ ๋ฐ์ด๋์ ๊ฐ๋ฅ์ฑ์ด ์๋ค. ๋ฐ๋ผ์ ์ด์ ๋ํ ์ฒ๋ฆฌ๋ฅผ ํด์ค์ผ ํ๋ค.
- 0๏ธโฃ $A < K^{n} < B$์ธ $K^{n}$์ ๊ตฌํ๋ ๋ฌธ์ ์ด๋ค. K์ ์ต๋๊ฐ์ n์ ๋ฌธ์ ์์ ์ฃผ์ด์ง ์ต์๊ฐ์ธ 2๋ก ์ค์ ํ์ ๋ ๊ตฌํ ์ ์์ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ ๊ฐ๋ฅํ K๋ฅผ ๋ชจ๋ ๊ตฌํ๊ธฐ ์ํด, n์ 2๋ผ๊ณ ์น๊ณ , ์๋ณ์ ๋ชจ๋ 2์ ์ ๊ณฑ๊ทผ์ผ๋ก ๋๋๋ค. $โA < K < โB$ ์ด๊ฒ์ด ๋ฐ๋ก ์ฐ๋ฆฌ๊ฐ ๊ตฌํด์ผ ํ K์ ์์ญ์ด๋ค.
- 1๏ธโฃ 1 < K < โB๊น์ง์ ์์๋ฅผ ๊ตฌํ๋ค. (
์๋ผํ ์คํ ๋ค์ค์ ์ฒด
), โโB๊น์ง์ ์ซ์๋ฅผ ์ดํด๋ณด๋ฉด ๋ ๊ฒ์ด๋ค. - 2๏ธโฃ ๊ตฌํด์ง ์์๋ค์ ๊ณ์ ์ ๊ณฑํ๋ฉฐ, B๋ณด๋ค ์์ ๋๊น์ง ๊ฐ๋ฅํ ์์ ๊ฐ์๋ฅผ ์ผ๋ค. ์ด๋ ์ฐ๋ฆฌ๋
Long
์ด ์๋Double
์๋ฃํ์ ์ฌ์ฉํ๋ค. double ์๋ฃํ์ ์ง์ํ๊ธฐ๋ฒ์ผ๋ก ๊ฐ์ ๋ํ๋ด๊ธฐ ๋๋ฌธ์ ์ ๋ฐ๋๋ ์กฐ๊ธ ๋จ์ด์ง ์ ์์ผ๋, Long๋ณด๋ค ํฐ ๊ฐ๋ overflow ์์ด ํํ ๊ฐ๋ฅํ๋ค. ์ด๋ฒ ๋ฌธ์ ๊ฐ ์ ํํ ๊ฐ์ ๊ตฌํ๋ ๊ฒ์ด ์๋ ๋์ ๋น๊ต์์ผ๋ก ์ถฉ๋ถํ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
(double ๊ฐ ๋ฐํํ๋Math.pow()
์ด์ฉ)
(1) ์๊ฐ๋ณต์ก๋ ๋ถ์ ๐
์์ ํ๋ณ์ ํด์ผํ๋ ์ต๋๊ฐ: โB
, ๋์ ํด ์ ๊ณฑํ ๊ฐ์ด B
๋ณด๋ค ์์์ง ํ์ธํ ๊ฐ: i
๋ผ๊ณ ํ ๋,
- ์์ ํ๋ณ: $O(โB \log(\log โB))$
- $K^{n}$ ์ธ๊ธฐ: $O(โB \log_i B)$
3. ์ฝ๋ ์๊ฐ ๐
(1) SUDO CODE
1. ์
๋ ฅ ๋ฐ๊ธฐ;
2. โB ๋ด์ ์์๊ฐ ์ฐพ๊ธฐ;
3. โB ๋ด์ ์์์ ๋ํ์ฌ ๊ทธ๊ฒ์ ๋์ ํด ์ ๊ณฑํ ๊ฐ ์ค B๋ฅผ ์ ๋ฒ์ด๋๋ ๊ฐ์ ๊ฐ์ ์ธ๊ธฐ
(2) JAVA CODE
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
static long A, B;
static long [] nums; // 0 = true, 1 = false
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
A = Long.parseLong(st.nextToken());
B = Long.parseLong(st.nextToken());
nums = new long [(int)Math.sqrt(B) + 1];
prime_shifter();
System.out.println(counting_almost_prime());
}
public static void prime_shifter(){
nums[0] = 1;
nums[1] = 1;
for (int i = 2; i <= Math.sqrt(Math.sqrt(B)); i++) {
if(nums[i] == 0){
for (int j = i*i; j <= Math.sqrt(B); j+=i) {
nums[j] = 1;
}
}
}
}
public static int counting_almost_prime(){
int cnt = 0;
for (long i = 2; i <= Math.sqrt(B); i++) {
if(nums[(int)i] == 0){
double j = i*i;
double acc = 2;
while(j <= B){
if(j >= A) cnt++;
j = Math.pow(i, ++acc);
}
}
}
return cnt;
}
}
4. ๋ฐฐ์ด ๊ฒ๋ค ๐ฏ
์์ง ์ดํญ ์ ๋ฆฌ
๋ฅผ ํตํด ํธ๋ ๋ฐฉ๋ฒ์ ๋ํ ๊ฐ์ ๋ชป ์ก๊ฒ ๋ค.
0