목록분할 정복을 이용한 거듭제곱 (3)
레야몬
1. 문제 크기가 N*N인 행렬 A가 주어질 때 A의 B제곱을 구하는 프로그램을 작성하시오. 각 원소를 1,000으로 나눈 나머지를 출력한다. - 1 - \(N, B(2 \leq N \leq 5, 1 \leq B \leq 100,000,000,000)\) - N개의 줄 - 행렬의 각 원소가 주어진다. 행렬의 각 원소는 1,000보다 작거나 같은 자연수, 또는 0이다. 행렬 A를 B 제곱한 결과를 출력한다. 2. 재정의 X 3. 해결 방법 X 4. 실수한 점, 개선할 점 문제 조건, 특히 숫자 범위를 확인하고 long long 범위를 넘어갈 수 있는지 재차 확인하기! #include #define fastio ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);..
1. 문제 M개의 자연수 N과 정수 K가 주어졌을 때 이항 계수 \(_{n}C_{k}\)를 \(1,000,000,007\)로 나눈 나머지를 구하는 프로그램을 작성하시오 - 1 - \(M(1 \leq M \leq 100,000)\) - M개의 줄 - \(N, K(1 \leq N \leq 4,000,000, 0 \leq K \leq N)\) M개의 줄에 \(_{n}C_{k}\)를 \(1,000,000,007\)로 나눈 나머지를 출력한다. 2. 재정의 X 3. 해결 방법 factorial값을 모두 저정한 다음 페르마의 소정리를 이용해 간단하게 풀면 된다. 4. 실수한 점, 개선할 점 항상 나오지만 자료형 범위 조심하자 분할 정복 사용할 때 재귀 함수를 사용하지 않고 반복문을 이용해하는 방법도 있었다. 이렇게 ..
1. 문제 \(_{n}C_{k} \% 1,000,000,007\)을 구하시오 - 1 - \(N, K(1 \leq N \leq 4,000,000, 0 \leq k \leq N)\) \(_{n}C_{k} \% 1,000,000,007\) 2. 재정의 X 3. 해결 방법 \(P = N! \% M\)을 구하기 \(S = (N-K)! \times k! \% M\) 구하기 \(S^{1,000,000,005} \% M\) 구하기 \(P \times S \% M\) 구하기 4. 실수한 점, 개선할 점 nCr을 팩토리얼로 계산할 때 반복문 하나로 줄일 수 있다. #include using namespace std; typedef long long ll; // 소수 const int mod = 1000000007; // ..