본문 바로가기

공부합시다

결과 MOD 나누는 거 관련 a = 999999999 b = 999999999 라고 가정하면 a % MOD + b % MOD = 1999999998이 되지만 (a + b ) % MOD라고 하면 99999998이 되어서 오버플로우가 나지 않는다 (와우) 이걸 int 범위 안에 넣게 하기 위해서 마지막에 자른다고 생각하면 잘 이해된다. 암튼 덧셈부터 하고 MOD하는게 오버플로우가 나지 않는 이유는 결과값이 10억 미만인게 보장이 됨 (마지막에 MOD 취해버리니깐) 그래서 이 두개를 더하면 20억 미만이 돼서 당연히 int안에 들어간다! > 만약 덧셈이 두 개 이상이라면? ((a+b) % MOD + c) % MOD 이런 순서대로 더한다 > 곱셈이라면?? 64비트 쓰세용 더보기
비트마스크로 부분집합 관리 burningjeong.tistory.com/274 [20/07/05] E. 부분수열의 합 (14225) 이 문제를 처음 봤을 때 어떻게 풀어야 할지 몰랐었다. n이 작아서 완전탐색이 가능하다고 생각이 들었지만 n 개수에 따라서 반복문을 만들어야 할 것 같아서 패스했다. 다음으로 규칙이 있나 생 burningjeong.tistory.com int n = 3; for (int i = 0; i < (1 더보기
거듭 제곱 빠른 계산 i64 ipow(i64 n, i64 x) { if (x == 0) return 1; i64 half = ipow(n, x / 2); half = (half * half) % MOD; if (x % 2 == 0) return half; return (half * n) % MOD; } 더보기
std::bitset 참고자료 https://www.geeksforgeeks.org/c-bitset-and-its-application/ C++ bitset and its application - GeeksforGeeks A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions. www.geeksforgeeks.org 전에 문제에서 bitset을 사용해서 문제를 풀었는데 long long int로 사용해서 최대.. 더보기
점 3개의 방향성을 나타내는 CCW 평행사변형 점을 기울기라 생각하고 구했는데 ccw라고 점 간의 관계로 직선인지 구할 수 있다. 구할 수 있는 경우는 세 가지로 점이 시계방향인지, 일직선인지, 반시계 방향인지 알 수 있다. 검은색 점이 1번, 녹색 점이 2번, 파란색 점이 3번이다. 삼각형의 면적을 구하는 방법으로 방향성을 구할 수 있다고 했지만 유도 방식은 잘 모르겠고.. (x2 - x1) * (y3 - y1) - (y2 - y1) * (x3 - x1) = S S >0 : 반시계 방향 S = 0 : 일직선 S < 0 : 시계방향 S의 부호에 따라 달라진다 참고링크 https://www.acmicpc.net/blog/view/27 점 3개의 방향성을 나타내는 CCW 세 점 P1(x1, y1), P2(x2, y2), P3(x3, y3)가 .. 더보기
소수 판별법 - 에라토스테네스의 체 공간 복잡도 O(N) 시간 복잡도 O(NloglogN) #include #include #include #include #include #include #include #include #include #include #define xx first #define yy second #define all(x) (x).begin(), (x).end() using namespace std; using i64 = long long; using ii = pair; using ii64 = pair; bool check[1000005]; int main() { for (int i = 2; i * i 더보기
조합 수 구하기 #include #include #include #include using namespace std; void combination(vector &v, int n, int r) { vector check(n - r, false); check.insert(check.end(), r, true); do { for (int i = 0; i < n; i++) { if (!check[i]) continue; // do something cout 더보기
BFS 너비 우선 탐색 #include #include #include #include #include #include #include #include #include #include #define xx first #define yy second using namespace std; using i64 = long long; using ii = pair; using ii64 = pair; int main() { int n, m, v; scanf("%d %d %d", &n, &m, &v); vector adj(n+1); for (int i = 0; i < m; i++) { int u, v; scanf("%d %d", &u, &v); adj[u].push_back(v); adj[v].push_back(u); } for (int i .. 더보기