• toc {:toc}

문제

μžμ—°μˆ˜ M κ³Ό N 이 μ£Όμ–΄μ§ˆ λ•Œ M 이상 N μ΄ν•˜μ˜ μžμ—°μˆ˜ 쀑 μ†Œμˆ˜μΈ 것을 λͺ¨λ‘ 골라 이듀 μ†Œμˆ˜μ˜ ν•©κ³Ό μ΅œμ†Ÿκ°’μ„ μ°ΎλŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

예λ₯Ό λ“€μ–΄ M=60, N=100 인 경우 60 이상 100 μ΄ν•˜μ˜ μžμ—°μˆ˜ 쀑 μ†Œμˆ˜λŠ” 61, 67, 71, 73, 79, 83, 89, 97 총 8 κ°œκ°€ μžˆμœΌλ―€λ‘œ, 이듀 μ†Œμˆ˜μ˜ 합은 620 이고, μ΅œμ†Ÿκ°’μ€ 61 이 λœλ‹€.

μž…λ ₯

μž…λ ₯의 첫째 쀄에 M 이, λ‘˜μ§Έ 쀄에 N 이 μ£Όμ–΄μ§„λ‹€.

M κ³Ό N 은 10,000 μ΄ν•˜μ˜ μžμ—°μˆ˜μ΄λ©°, M 은 N 보닀 μž‘κ±°λ‚˜ κ°™λ‹€.

좜λ ₯

M 이상 N μ΄ν•˜μ˜ μžμ—°μˆ˜ 쀑 μ†Œμˆ˜μΈ 것을 λͺ¨λ‘ μ°Ύμ•„ 첫째 쀄에 κ·Έ 합을, λ‘˜μ§Έ 쀄에 κ·Έ 쀑 μ΅œμ†Ÿκ°’μ„ 좜λ ₯ν•œλ‹€.

단, M 이상 N μ΄ν•˜μ˜ μžμ—°μˆ˜ 쀑 μ†Œμˆ˜κ°€ 없을 κ²½μš°λŠ” 첫째 쀄에 -1 을 좜λ ₯ν•œλ‹€.

좜처:https://www.acmicpc.net/problem/2581

풀이

bool is_primeNum(int x)
{
	int i = 2;
	while(i*i<=x)
	{
		if(x%i==0)
			return false;
		i++;
	}
	return true;
}

1978: μ†Œμˆ˜ μ°ΎκΈ°μ—μ„œ μ‚¬μš©ν–ˆλ˜ μ†Œμˆ˜ νŒλ³„ ν•¨μˆ˜λ₯Ό μ‚¬μš©.

  1. m λΆ€ν„° n κΉŒμ§€ λ°˜λ³΅λ¬Έμ„ 톡해 μ†Œμˆ˜μΈμ§€ νŒλ³„. μ†Œμˆ˜μ΄λ©΄ sum 에 λ”ν•˜κ³  처음 찾은 값을 min 에 λ„£μ–΄λ‘”λ‹€. ν˜Ήμ‹œ λͺ°λΌ if 문을 톡해 μ΅œμ†Ÿκ°’ νŒλ³„
  2. μ½”λ“œλ₯Ό λͺ‡ 번 λŒλ €λ³΄λ©΄μ„œ 이 문제의 μš”μ μ€ 1, 2 λ₯Ό μ–΄λ–»κ²Œ μ²˜λ¦¬ν•˜λŠ”κ°€λΌλŠ” 것을 발견. 머리 ꡴리닀 κ²°κ΅­ μΌ€μ΄μŠ€ λΆ„λ₯˜λ₯Ό 톡해 μ§€μ €λΆ„ν•˜κ²Œ 해결함.

ν™€μˆ˜λ‘œ λ°˜λ³΅λ¬Έμ„ λŒλ¦¬λ €λ‹€ λ³΅μž‘ν•΄μ§„ 것 κ°™λ‹€.

#include <iostream>
 
using namespace std;
 
bool is_primeNum(int x);
 
int main()
{
	int m, n, sum=0, min = 10001, i;
	cin >> m >> n;
	
	if(m==1)
	{
		if(n>=2)
		{
			sum+=2;
			min=2;
			i = m;
		}
	}
	if(m==2)
	{
		sum+=2;
		min=2;
	}
	if(m%2==0)
	{
		i = m+1;
	}
	else
	{
		i = m;
	}
	
	for(i; i<=n; i+=2)
	{
		if(i == 1) continue;
		if(is_primeNum(i))
		{
			sum+=i;
			if(min > i)
				min = i;
		}
	}
	if(sum == 0)
		cout << -1 << endl;
	else
	{
		cout << sum << endl << min << endl;
	}
	
	return 0;
}
 
bool is_primeNum(int x)
{
	int i = 2;
	while(i*i<=x)
	{
		if(x%i==0)
			return false;
		i++;
	}
	return true;
}