U E D R , A S I H C RSS

Factorial Factors/��현

��

n! 를 구성하는 2 <= k <= n � k� �수를 구하는 방법과,
k가 소수�지 아닌지 �별하는 방법� 따� ��가 결정�다.

기본�으로 n만� �기� 배열 fac� 잡고 해당 ��스� �수� 개수를 넣는다. (ex.fac8 �면 8� 해당하는 �수� 개수 즉 3� 들어간다.)
�렇게 배열� 잡� �유는 예를들어 나중� 16� �수� 개수를 구한다면 16 = 8x2 �므로 fac16 = fac8+1 = 4가 �다.
fac8� 미리 구해져 배열� 저장�어있� 값 �므로 계산� 바로 나온다.

하지만 k가 소수�면 �러한 방법� 통하지 않는다. 소수는 나름� �별�칙� 따� �단. 소수�별�는 수학공�� �용�는� �것� �략 ^^

소스


~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();
	}
}
Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:23:15
Processing time 0.0040 sec