백준 11401 c++

magicdrill·2024년 4월 3일

백준 문제풀이

목록 보기
252/673

백준 11401 c++

#include <iostream>
#define MOD 1000000007

using namespace std;

int input(int lower, int upper)
{
	//cout << "input()" << endl;
	int A;

	while (1)
	{
		cin >> A;
		if (A >= lower && A <= upper)
		{
			break;
		}
		else
		{
			;
		}
	}

	return A;
}

long long int recursive_pow(long long int base, long long int exponent)
{
	long long int temp;

	if (exponent == 0)
	{
		return 1;
	}
	else
	{
		temp = recursive_pow(base, exponent / 2) % MOD;
		temp = temp * temp % MOD;
		if (exponent % 2 == 0) //지수가 짝수
		{
			return temp % MOD;
		}
		else//지수가 홀수
		{
			return base * temp % MOD;
		}
	}
}

long long int factorial(long long int a, long long int b)
{
	int i;
	long long int result = 1;

	for (i = a; i >= a - b + 1; i--)
	{
		result = (result * i) % MOD;
	}

	return result;
}

long long int find_result(long long int N, long long int K)
{
	long long int result = 0;
	long long int A = 0, B = 0;

	//분자
	A = factorial(N, K);
	//cout << A << "\n";
	//분모
	B = factorial(K, K);
	//cout << B << "\n";
	//결과//페르마의 소정리
	result = (A * recursive_pow(B, MOD - 2)) % MOD;

	return result;
}

int main(void)
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	long long int N, K;

	N = input(1, 4000000);
	K = input(0, N);
	cout << find_result(N, K) << "\n";

	return 0;
}

0개의 댓글