~cpp import java.util.*; import java.math.*; public class FactorialFactors2 { final int CASE_N = 1000000; //테스트할 케이스 수 int fac[] = new int[CASE_N+1]; //인수저장배열 ArrayList<Integer> prime = new ArrayList<Integer>(); boolean isPrime(int num){ for(int k=0;k<prime.size();k++){ if(num%prime.get(k)==0) return false; } return true; } void printResult(){ int total=0; for(int i=2;i<=CASE_N; i++) total+=fac[i]; System.out.println(total); } void run(){ long time = System.currentTimeMillis(); prime.add(2); fac[2] = 1; int sqrt = (int)Math.sqrt(CASE_N); //n!이므로 알고리즘상 2는 사전에 미리 처리하고 3~n까지 각각의 수에 대하여 인수를 계산한다. for(int i=3;i<=CASE_N;i++){ int num = i; //num의 인수의 개수를 구하는 루프. for(int j=2; num!=1;){ if(num%j == 0){ num = num/j; fac[i]++; fac[i]+=fac[num]; break; } else j++; //7로 나눌때까지 안나눠떨어지는 수 이면 소수를 의심해본다. if (j == 7 && isPrime(num) == true) { fac[i]++; if (num <= sqrt) // 우리가 필요로하는 소수는 sqrt보다 작은 소수만 있음 된다. prime.add(num); break; } } } printResult(); System.out.print(System.currentTimeMillis()-time); } public static void main(String[] args) { new FactorialFactors2().run(); } }