[BOJ 26973] Circular Barn

2023. 1. 27. 18:44Baekjoon

728x90

 

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

 

26973번: Circular Barn

For the first test case, Farmer John can remove $1$, $2$, or $3$ cows from the first room. Whichever number he removes, Nhoj can remove the remaining cow(s), forcing FJ to lose when they circle back to the first room. For the second test case, FJ can remov

www.acmicpc.net

 

- 문제 요약

 

John과 Nhoj는 원형 헛간 (1 <=N <=2*10^5개의 헛간이 원형으로 이어져 있는 곳)에서 게임을 하고 있습니다. 각 헛간에는 ai(1 <=ai <=5*10^6) 마리의 소가 있습니다. 게임은 아래와 같은 방식으로 진행됩니다.

  • 두 사람은 항상 같은 헛간에 있습니다. 방에 들어간 후 두 사람은 각각 한 턴을 진행하고, John이 먼저 시작합니다. 두 사람은 1번 헛간에 제일 먼저 들어갑니다.
  • 들어갔을 때 헛간에 소가 없으면 지게 됩니다. 헛간에 소가 있다면 1~(현재 방에 있는 소의 수)중 소수인 수를 선택하고 그 만큼의 소를 헛간 밖으로 내보냅니다.
  • 두 사람은 턴이 끝나면 다음 번호 헛간으로 이동합니다.(현재 위치가 N번 헛간이라면 다시 1번 헛간으로 이동합니다)

두 사람이 항상 최적의 상태로 플레이 할 때 게임에서 승리하는 사람의 이름을 출력하세요.

(두 사람의 이름은 "Farmer John", "Farmer Nhoj"입니다)

 

 

- 알고리즘 정리

 

N이 1일 경우에는 ai가 4로 나누어지지 않는 경우에만 John이 승리합니다.

N이 1보다 클 때, 증명을 하다보면 a1이 짝수일 경우에 답이 a1/2 임을 알 수 있습니다.

 

N의 범위인 5*10^6만큼의 소수를 미리 배열에 넣어놓고(에라토스테네스의 체), 헛간의 배열이 원형이라는 점을 이용해서점화식을 작성해 주면 됩니다.

 

 

 - 코드 작성

 

#include<bits/stdc++.h>
using namespace std;
 
#define MAX 5000001
int t,n,mnmn[MAX]={0,1},mxmx[4]={2,1,2,3};
bool check[MAX];
 
int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	for(int i=2;i<MAX;i++){
		if(!check[i]){
			for(int j=i;j<MAX;j+=i){
				check[j]=true;
			}
			mxmx[i%4]=i;
		}
		mnmn[i]=(i-mxmx[i%4])/2+1;
	}
	cin>>t;
	while(t--){
		cin>>n;
		int ans=MAX;
		for(int i=0;i<n;i++){
			int a;
			cin>>a;
			if(mnmn[a]/2<ans/2){
				ans=mnmn[a];
			}
		}
		if(ans&1){
			cout<<"Farmer John"<<endl;
		}
		else{
			cout<<"Farmer Nhoj"<<endl;
		}
	}
}

코드 제출 결과
틀왜맞

728x90

'Baekjoon' 카테고리의 다른 글

[BOJ 1069] 집으로  (0) 2023.02.02
[BOJ 14454] Secret Cow Code  (0) 2023.01.27
[BOJ 15748] Rest Stops  (0) 2023.01.25
[BOJ 14452] Cow Dance Show  (0) 2023.01.23
[BOJ 14172] Moocast  (0) 2023.01.20