코딩테스트

[백준] 선물 전달 c++

코딩너구리 2025. 2. 19. 13:16

선물 전달

 
시간 제한메모리 제한제출정답맞힌 사람정답 비율
2 초 128 MB 5402 2752 2266 50.773%

문제

이번 ACM-ICPC 대회에 참가한 모든 사람들은 선물을 하나씩 준비했다.

대회가 끝나고 난 후에 각자 선물을 전달하려고 할 때, 선물을 나누는 경우의 수를 구하는 프로그램을 작성하시오.

모든 사람은 선물을 하나씩 받으며, 자기의 선물을 자기가 받는 경우는 없다.

입력

첫째 줄에 ACM-ICPC 대회에 참가한 학생의 수 N(1 ≤ N ≤ 1,000,000)이 주어진다.

출력

경우의 수를 1,000,000,000으로 나눈 나머지를 첫째 줄에 출력한다.


#include <iostream>

using namespace std;

int N;

int mod = 1000000000;
long D[1000001];

int main()
{
	cin >> N;
	D[1] = 0; // 혼자서는 선물 교환 X
	D[2] = 1; // 2명일 경우엔 교환이 오로지 1번
	for (int i = 3; i <= N; i++)
	{
		//i명이 교환할 수 있는 경우의 수(점화식)
		D[i] = (i - 1) * (D[i - 1] + D[i - 2]) % mod;
		//값을 넣기전에 마지막에  % mod 연산 수행 (문제 요청사항)
	}

	cout << D[N];
}

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