Baekjoon

Baekjoon 1124번 언더프라임

ppwag 2022. 4. 10. 23:00

문제

https://www.acmicpc.net/problem/1124

걸린 시간

-

풀이

TypeScript

const fs = require('fs');
const filePath = process.platform === 'linux' ? '/dev/stdin' : './input';
const stdin = fs.readFileSync(filePath).toString().trim().split('\n').map((s: string) => s.trim());
const input = (() => {
  let line = 0;
  return () => stdin[line++];
})();

const [a, b] = input().split(' ').map(Number);

const MAX_SIZE: number = 100001;
const dp: number[] = Array(MAX_SIZE).fill(0);
const prime: number[] = []; // 소수 목록
const isPrime: boolean[] = Array(MAX_SIZE).fill(true); // 에라토스테네스
isPrime[0] = isPrime[1] = false;

for(let i = 2; i < MAX_SIZE; i++){
  if(!isPrime[i]) continue;
  prime.push(i);
  dp[i] = 1;
  for(let j = i+i; j < MAX_SIZE; j += i){
    isPrime[j] = false;
  }
}

for(let i = 4; i < MAX_SIZE; i++){
  if(isPrime[i]) continue;
  let j: number = 0;
  while(j < prime.length && i%prime[j] !== 0){
    j++;
  }
  dp[i] = dp[prime[j]] + dp[i/prime[j]];
}

let ans: number = 0;
for(let i = a; i <= b; i++){
  if(isPrime[dp[i]]) ans++;
}
console.log(ans);

에라토스테네스의 체 + dp 를 이용한 풀이

예제를 몇개 풀어보니 소인수의 개수를 tabulation 할 수 있겠단 생각이 들었다. 에라토스테네스의 체를 이용하여 소수 목록을 전부 구해두고, 소수가 아닌 것들에 대해서만 첫 번째 소인수를 찾고 나머지는 dp 배열에서 가져다 사용했다.

점화식 : dp[i] = dp[prime[j]] + dp[1/prime[j]]

dp[i] = 1 + dp[1/prime[j]] 와도 같겟다.

'Baekjoon' 카테고리의 다른 글

Baekjoon 3372번 보드 점프  (0) 2022.04.16
Baekjoon 14501번 퇴사  (0) 2022.04.13
Baekjoon 2567번 색종이 - 2  (0) 2022.04.08
Baekjoon 2659번 십자카드 문제  (0) 2022.04.03
Baekjoon 1913번 달팽이  (0) 2022.03.29

댓글