#include int f(int *a) { int b = *a%4; if(b==0) b=*a; else if(b==1) b=1; else if(b==2) b=*a+1; else if(b==3) b=0; return b; } int main(void) { int n; scanf("%d",&n); while(n--) { int a, b; scanf("%d %d", &a, &b); --a; printf("%d\n", f(&b)^f(&a)); } } XOR의 성질을 이용하는 문제입니다. 1. 1부터 연속적으로 XOR을 하면 0001 0001 ... 1 0002 0003 ... 3 = 2 + 1 0003 0000 ... 0 0004 0004 ... 4 0005 0001 ... 1 0006 0007 ... 7 =..
#include #define ll long long ll U(ll a, ll b) { ll r = a%b; return (r) ? U(b, r) : b; } int main(void) { ll n, b, X=0, Y=0, sign = -1; scanf("%lld %lld",&n, &b); for(int i=0; i a = -Y/X 입니다. 여기서 계산을 용이하기 위해 부호가 양인지 음인지를 나타내는 변수 하나를 만든다음 sign = -1 을 기본으로 해줍니다 여기서 -1을 기본으로 하는 이유는 a = -Y/X 에서 -을 sign에 넣어준 것 입니다. Y / X 계산에서 X, Y 둘 다 양수이어야 계산이 용이하므로, 음수인 경우 양수로 바꾸어 줍니다. 물론 sign의 값도 변경해주어야 합니다 (양이면 음..
#include int U(int a, int b) { //유클리드 (최대공약수) int r = a%b; if(r) U(b, r); else return b; } int main(void) { int n, a, b; scanf("%d %d",&n, &a); for(int i=0; i0) { b = U(b, tmp); } else b = tmp; } printf("%d", b); } https://www.acmicpc.net/problem/17087 17087번: 숨바꼭질 6 수빈이는 동생 N명과 숨바꼭질을 하고 있다. 수빈이는 현재 점 S에 있고, 동생은 A1, A2, ..., AN에 있다. 수빈이는 걸어서 이동을 할 수 있다. 수빈이의 위치가 X일때 걷는다면 1초 후에 X+D나 X-D로 이 www.ac..
#include #include #define MAX 10001 using namespace std; vector vec[MAX]; vector v; int ans, index; //ans : 트리에서 가장 긴 간선들의 합, index : 처음 DFS을 돌려서, 임의의 점 중 가장 먼 곳에 있는 점의 인덱스 void DFS(int root, int dis) { v[root] = true; if(dis > ans) { //이전의 가장 긴 거리보다 더 크다면, ans와 index을 갱신한다. ans = dis; index = root; } for(pairx : vec[root]) { //연결된 간선들 중 if(!v[x.first]) { //방문하지 않은 것만 DFS(x.first, x.second + dis..
#include using namespace std; vector vec[100001]; //간선 저장용 vector dp; //dp용 vector v; //방문처리용 void loop(int r) { //DFS for(int x : vec[r]) { if(!v[x]) { v[x] = true; //방문처리 loop(x); dp[r] += dp[x]; } } } int main(void) { ios::sync_with_stdio(0); cin.tie(0); int n, r, q; cin >> n >> r >> q; dp.assign(n+1, 1); v.assign(n+1, false); for(int i=1; i> a >> b; vec[a].emplace_back(b); vec[b].emplace_bac..
#include #define Q q.front() using namespace std; int n, m, ans = 1e9, blank = 0; int Map[50][50] = {}; vector virus; vector vec; int V[4] = {-1, 0, 1, 0}, H[4] = {0, 1, 0, -1}; void BFS() { queue q; //큐 int tmp = 0, cnt = 0; //tmp는 탐색 level, cnt는 0을 채운 개수 bool v[n][n]; //방문 확인 memset(v, false, sizeof(bool)*n*n); //초기화 for(pair i : vec) { //활성화 할 바이러스들을 큐에 삽입 및, 방문 처리 int x = i.first; int y = i...
#include #define Q q.front() using namespace std; int V[4] = {-1, 0, 1, 0}; int H[4] = {0, 1, 0, -1}; int n, m, zero = -3; //벽 3개를 무조건 설치하므로 -3으로 시작합니다. int Max = 0; int Map[8][8] = {}; vector two; void bfs(void) { //bfs queue q; //큐 int cnt = zero; //벽 3개를 설치한 이후 0의 개수 bool v[n][m]; //방문 확인 배열 memset(v, false, sizeof(bool)*n*m); //방문 확인 for(pair i : two) q.push({i.first, i.second}); //바이러스인 곳을 ..
var a : array[1..90] of integer; i, j, n : Integer; c : char; b : array[1..12] of Char; begin b := 'BRONZESILVER'; readln(n); for i:=1 to n do begin read(c); a[byte(c)] := a[byte(c)] + 1; end; i:=1001; a[byte('E')] := a[byte('E')] div 2; a[byte('R')] := a[byte('R')] div 2; n := 12; for j:=1 to n do begin if a[byte(b[j])] < i then i := a[byte(b[j])]; end; write(i); end. 풀이 : 문자별로 입력된 개수 만큼 + 을 해준..
- Total
- Today
- Yesterday
- BFS
- DP
- Mo.s
- 최대공약수
- 백준
- 그리디
- 카드
- 누적 합
- 오프라인 쿼리
- 정렬
- java
- 16120번
- 세그먼트 트리
- 덱
- 6198
- union
- 1835번
- 플로이드
- C언어
- C++
- DFS
- 누적합
- 최소 스패닝 트리
- 그래프
- 6198번
- 트리
- 1835
- 스택
- find
- Krustal
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |