본문 바로가기

전체 글

(13)
[백준 30413]양 한 마리... 양 A마리... 양 A제곱마리... C++, 모듈로 곱셈 역원, 페르마의 소정리 이 문제는 ((AB-1)/(A-1)) % m 를 구하는 문제이다.(등비수열의 합 공식)나눗셈의 경우 모듈로 연산의 분배법칙이 성립하지 않으므로 모듈로 곱셈 역원을 이용한다. m은 소수이므로 A-1과 서로소이기 때문에 A-1의 역원은 항상 존재한다.((AB-1)/(A-1)) % m는 (AB-1) * (A-1)-1 % m 과 동치이다( (A-1)-1는 (A-1)의 역원) (A-1)-1을 구하기 위해 페르마의 소정리를 이용한다.페르마의 소정리에 의해 m이 소수일 때, xm-1 % m = 1 이므로 x * xm-2 % m = 1 이다. 따라서 x의 역원은 xm-2이다.따라서 (A-1)-1 = (A-1)m-2 (AB-1) * ((A-1)m-2) % m를 구하면 답을 구할 수 있다.이때 A=1일때는 예외처리를 해주..
[C++] 구조적 바인딩과 tie의 주의점 c++에는 tuple을 만들어 주는 tie가 존재합니다. tie는 값들의 tuple을 생성하여 참조를 반환합니다. 구조적 바인딩에서 auto는 컴파일러가 오른쪽 표현식의 타입에 따라 왼쪽 변수들의 타입을 추론합니다. 따라서 auto [a, b, c] = tie(x, y, z) 같은 형식으로 값을 대입하면 a, b, c는 auto에 의해 참조자 형태가 됩니다. #include using namespace std;int main(){ int x = 1, y = 2, z = 3; auto [a, b, c] = tie(x, y, z); x = 5; cout  출력 : 5 2 3 따라서 tuple을 생성해 값을 반환하는 make_tuple을 이용하면 값을 할당받게 됩니다. #include using nam..
[백준 16565]N포커 C++, 포함배제의 원리 포함 배제의 원리에 따르면 위와 같은 식을 만족한다. 백준16565 N포커 문제는 포카드를 구성하는 경우의 수를 구하는 문제이다. 포카드를 구성하는 경우는 A카드로 포카드를 구성하는 경우, 2카드로 포카드를 구성하는 경우 ... K카드로 포카드를 구성하는 경우의 합으로 나타낼 수 있다. 이를 구하기 위해 위 식을 이용하면,(포카드를 구성하는 경우의 수) =(A카드로 포카드를 구성하는 경우의 수) ∪ .... ∪(K카드로 포카드를 구성하는 경우의 수) =Σi카드로 포카드를 구성하는 경우의 수- Σi,j 2가지 카드로 포카드를 구성하는 경우의 수 ...+(-1)^x-1 Σi,j,...x 가지 카드로 포카드를 구성하는 경우의 수임을 알 수 있다. 이때 x가지 카드로 포카드를 구성하는 경우의 수는13Cx * 5..
[C++] vector에서의 회전 vector에는 원소를 회전시켜주는 메소드가 존재한다. 1. 시계 방향으로 회전std::rotate(v.begin(), v.begin() + k, v.end());위와 같이 사용하면 원소가 시계방향으로 k번 회전한다.즉 v={1, 2, 3, 4, 5} 에 k=2를 대입하여 실행하면 v={3, 4, 5, 1, 2} 가 된다. 2. 반시계 방향으로 회전std::rotate(v.rbegin(), v.rbegin() + k, v.rend());위와 같이 사용하면  반시계 방향으로 회전한다.즉 v={1, 2, 3, 4, 5} 에 k=2를 대입하여 실행하면 v={4, 5, 1, 2, 3}가 된다. 시간 복잡도는 보통 O(n)이고, 회전 후 원래 첫 번째 요소의 새로운 위치를 가리키는 반복자를 반환한다.
[C++] 메모리 제한 바이트는 위와 같은 단위를 가진다. 메모리 제한이 128mb인 문제라면  128*10^6 바이트, int형 배열은 하나당 4바이트 이므로, 32*10^6승개의 공간을 가지는 배열이 선언 가능하다.(단 c++에서 기본으로 사용하는 메모리가 있음에 유의)
[백준 11997] Load Balancing (Silver) C++ 1. 문제 https://www.acmicpc.net/problem/11997 11997번: Load Balancing (Silver) Farmer John's \(N\) cows are each standing at distinct locations \((x_1, y_1) \ldots (x_N, y_N)\) on his two-dimensional farm (\(1 \leq N \leq 1000\), and the \(x_i\)'s and \(y_i\)'s are positive odd integers of size at most \(1,000,000\)). FJ wants to par www.acmicpc.net 2. 풀이 이 문제는 누적 합을 이용해 i,j에 울타리를 세웠을 때, 0,0 ~ i,j에..
[C++] vector에서의 unique를 이용한 중복 제거 vector에서 unique와 erase를 이용하면 중복을 제거할 수 있다.1. uniqueunique함수는 정렬된 범위에서 유일한 요소들을 앞으로 이동시켜준다. unique 함수는 중복된 값은 뒤쪽으로 보내고 삭제하지는 않는다. 따라서 erase 함수를 이용하여 뒷부분을 제거해줘야 한다. unique(시작위치, 끝위치)와 같은 형식을 가지고 있다.2. erasevector에 내장된 erase함수를 사용하면 원하는 위치의 원소들을 제거할 수 있다.vector.erase(시작위치, 끝위치)와 같은 형식을 가지고 있다. unique는 유일한 요소들의 끝을 가르키므로, 다음과 같이 이용을 하면 중복된 값을 모두 제거할 수 있다.arr.erase(unique(arr.begin(), arr.end()), arr...
[C++] vector size 주의사항 return값이 unsigned 타입 이므로 vector.size() - 1 은 언더플로우가 발생한다. for(int i = 0; i < am.size() - 1; i += 2) { ans += am[i] * am[i+1]; } 위와 같은 코드를 작성하는 경우 am.size()가 0일때 언더플로우가 발생하여 i가 am.size()의 값을 초과해 런타임 에러 (OutOfBounds)가 발생할 수 있다. 아래와 같이 수정하면 된다. for(int i = 0; i < (int)am.size() - 1; i += 2) { ans += am[i] * am[i+1]; } 런타임 에러 언어: C99, C11, C90, C2x, C++98, C++11, C++14, C++17, C++20 런타임 에러 이유설명Asser..