Math for CS2012. 5. 7. 23:51

소수(prime number)는 어떤 정수 a를 정수 b로 나눌때 나머지가 0인 b가 정확하게 다른 두 정수 값이 존재하면 그것을 소수라고 한다. 정의에 의해 1은 prime이 아니다. 1은 오직 1 하나에 의해서 나누어 지기 때문에  소수가 될 수 없다.

ex) 5는 1, 5에 의해서만 나누어지기 때문에 소수이다.

     49는 아니다. 1, 7, 29가 존재하기 때문이다.


그러면 소수를 찾는 방법을 생각해 봅시다.

// 5000까지 소수를 찾는 방법

1. 모든 가능한 수로 나누어 보는 방법

 쉽게 말해 어떤 수 P가 소수인지는 2부터 P-1까지 차례대로 나누어 보는 방법이다. 

이 방법은 상당히 느린 방법이다. 많은 정수들을 일일이 다 확인해야 한다.


int N = 5000;

int isPrime( int i ) {

   for( int j = 2; j < i; j++ ) {

       if( i % j == 0 ) // j에 의해 나누어지면 소수가 아니다.

       return 0;

   }

   return 1;

}

int main() {

   for( int i = 2; i <= N; i++ ) {

       if( isPrime(i) == 1 )

       printf("%d ", i);

   }

   return 0;

}

2. 숫자의 특성을  이용하여   까지만 검사하는 방법

예를 들어 36이라는 숫자를 살펴보면

1 * 36

2 * 18

3 * 12

4 * 9

6 * 6

여기서 볼 수 있듯이 앞쪽의 숫자를 알면 뒷쪽의 숫자는 자동적으로 알 수 있다. 

결국 n-1까지 체크할 필요없이 하면 된다는 것이다.

int N = 5000;

int isPrime( int i ) {

for( int j = 2; j*j <= i; j++ ) {

        // 원래는 를 구해야 하지만 양변의 제곱을 적용해도 된다.

if( i % j == 0 )

return 0;

}

return 1;

}

int main() {

for( int i = 2; i <= N; i++ ) {

if( isPrime(i) == 1 )

printf("%d ", i);

}

return 0;

}


3. 짝수는 검사할 필요가 없다.

2를 제외한 짝수는 소수가 아니다. 홀수가 홀수에 의해 나누어지는지만 검사하면된다.

int N = 5000;

int isPrime( int i ) {

for( int j = 3; j*j <= i; j += 2 ) { 

if( i % j == 0 ) // 

return 0;

}

return 1;

}

int main() {

printf("2 "); 

for( int i = 3; i <= N; i += 2 ) { 

if( isPrime(i) == 1 )

printf("%d ", i);

}

return 0;

}


4. Sieve of Eratosthenes

 어떤 숫자 b를 b보다 작은 소수들로 나누어지지 않으면 그것은 소수이다. 

예를 들어 7은 소수이다. 왜냐하면 2, 3, 5로 나누어지지 않기 때문이다. 

이것은 이전의 소수들만 체크하면 소수인지 아닌지 알 수 있다. 여기서 물론 은 계속 적용될 수 있다. 

이 아이디의 핵심은 배수들은 모두 버리는 것이다. 예를 들어 2가 소수이므로 배수인 4, 6,8... 은 버린다.

int N = 5000;

int status[5001];

int main() {

int i, j;

for( i = 2; i*i <= N; i++ ) {

if( status[i] == 0 ) {

for( j = 2 * i; j <= N; j += i )

status[j] = 1; 

}

}

for( i = 2; i <= N; i++ ) {

if( status[i] == 0 ) {

printf("%d ", i);

}

}

return 0;

}


5. 4에서 다시 짝수는 검사를 할 필요가 없다.

int N = 5000;

int status[5001];


int main() {

int i, j;

for( i = 3; i <= N; i += 2 ) {

if( status[i] == 0 ) {

for( j = 3 * i; j <= N; j += 2 * i )

status[j] = 1; 

}

}

printf("2 ");

for( i = 3; i <= N; i += 2 ) {

if( status[i] == 0 ) {

printf("%d ", i);

}

}

return 0;

}


6. 수정된 버리기 기술

n이 소수인지 판단할 때 까지 소수들 중에서 배수는 바로 버리는 방법이다. 

int N = 5000, status[5001];

int main() {

int i, j;

for( i = 3; i*i <= N; i += 2 ) {

if( status[i] == 0 ) {

for( j = i * i; j <= N; j += i + i )

status[j] = 1; 

}

}

printf("2 ");

for( i = 3; i <= N; i += 2 ) {

if( status[i] == 0 ) printf("%d ", i);

}

return 0;

}


7. 메모리까지 고려한다면 배열을 n개 필요없다. 

이 부분은 여러분들을 위해 남겨두도록 하겠다.







Posted by 알 수 없는 사용자
PKU/번역2012. 5. 7. 23:40

시간 제한 1초

메모리 제한 65536K


문제 설명

소가 먹을 건초가 바닥났다. 이런 긴급 상황에는 발빠른 조치가 필요하다. 그래서 Bessie는 다른 농장으로 가서 건초가 얼마나 있는지 조사하고자 한다. N가의 농장이 있으며 베시는 1번 농장부터 방문할 것이다. 베시는 농장 간에 연결된 M개의 왕복 도로(도로의 길이는 1,000,000,000을 초과하지 않음) 중 일부 또는 모두를 건너다닐 것이다. 어떤 농장은 각각 다른 길이의 길로 다양하게 연결되어 있을 수도 있다. 모든 농장은 1번 농장과 하나 이상의 길로 연결되어 있다.

 Bessie는 얼마나 큰 가죽 물통이 필요한지 결정하려고 하고 있다. 그녀는 한 유닛의 길에 1온스의 물이 필요하다는 것을 안다. 각 농장에서 물은 더 구할 수 있기 때문에 가장 긴 거리의 길에 대해서 걱정하고 있다. 물론, Bessie는 농장간의 경로를 미리 정해서 운반하는 물의 양을 최소화할 것이다.

 베시가 다음의 사실을 알 수 있도록 도와주어라. Bessie가 최대 얼마만큼의 물을 들고 가야 하는가? 그리고 Bessie가 최소의 거리를 선택할 것이라는 가정 하에 Bessie가 가게 될 두 농장간의 거리 중 가장 먼 거리는 얼마인가? 물론 Bessie는 지나가야 하는 길의 경로를 최소화하기 위하여 왔던 길을 되돌아 갈 수도 있다.


입력

Line 1:두 정수 N,M(2<=N<=2,000, 1<=M<=10,000)

Line 2~M+1:세 정수 A_i,B_i,L_i. A_i에서 B_i까지 가는데 L_i만큼의 거리를 가야한다는 것


출력

길을 가로지르기 위해 필요한 가장 긴 거리를 나타내는 하나의 정수를 출력한다.


입력 예제

3 3

1 2 23

2 3 1000

1 3 43


출력 예제

43


http://poj.org/problem?id=2395

'PKU > 번역' 카테고리의 다른 글

PKU 1068(Parencodings) 번역  (0) 2012.05.16
PKU 3507(Judging Olympia) 번역  (0) 2012.05.11
PKU 3258(River Hopscotch) 번역  (0) 2012.05.10
PKU 2027(No Brainer) 번역  (0) 2012.05.06
PKU 1000(A+B Problem) 번역  (0) 2012.05.06
Posted by 알 수 없는 사용자
PKU/번역2012. 5. 6. 21:43

시간 제한 1

메모리 제한 30MB

 

문제 설명

좀비는 뇌를 좋아해요

 

입력

Line 1:숫자들의 쌍의 갯수 n

Line 2~n+1:뇌의 갯수 X와 좀비가 사는데 필요한 뇌의 갯수 Y

 

 

출력

좀비가 살 수 있을 정도로 뇌가 있으면 "MMM BRAINS", 없으면 "NO BRAINS"를 출력한다.

 

입력 예제

3

4 5

3 3

4 3

 

출력 예제

NO BRAINS

MMM BRAINS

MMM BRAINS

 

http://poj.org/problem?id=2027

'PKU > 번역' 카테고리의 다른 글

PKU 1068(Parencodings) 번역  (0) 2012.05.16
PKU 3507(Judging Olympia) 번역  (0) 2012.05.11
PKU 3258(River Hopscotch) 번역  (0) 2012.05.10
PKU 2395(Out of Hay) 번역-USACO 2005 March Silver  (0) 2012.05.07
PKU 1000(A+B Problem) 번역  (0) 2012.05.06
Posted by 알 수 없는 사용자