์ ์๋ก ์ ์ ๋๋ก ํ๊ณ ์ ํ๋ค๋ฉด ๊ทธ ๋ฒ์๊ฐ ๋ง๋ง์ฐฎ๋ค.
ํ์ง๋ง, ์ฝ๋ฉ ํ ์คํธ์ ๋์ค๋ ์ผ๋ฐ์ ์ธ ์ ํ์ด๋ผ๋๊ฒ ์กด์ฌํ๊ธฐ์ ๊ทธ ๋ํ์ ์ธ ๊ฒฝ์ฐ๋ค์ ๋์ฒํ ์ ์๋ค.
๊ทธ ์ค ๋ง์ด ์ฐ์ด๋ ๊ฒ์ ์ ํด๋ฆฌ๋ ํธ์ ๋ฒ(ํ์ฅ๋ ์๋ค)์ด๋ค.
๋ฌผ๋ก ์ค์ผ๋ฌ ํผ ํจ์๋ ๊ฐํน ์ฐ์ด๋ ์ ํด๋ฆฌ๋ ํธ์ ๋ฒ์ ๋นํ ๋ฐ๋ ์๋๋ค.
๊ทธ ์ด์ ๋ ์ ํด๋ฆฌ๋ ํธ์ ๋ฒ์ด ์ต๋ ๊ณต์ฝ์์ ์ต์ ๊ณต๋ฐฐ์๋ฅผ ๊ตฌํ๋ ์ ๋ง ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
์ค์ผ๋ฌ ํผ ํจ์
์ค์ผ๋ฌ ํผ ํจ์๋ 1๋ถํฐ N๊น์ง์ ๋ฒ์์์ N๊ณผ ์๋ก์์ธ ์์ฐ์์ ๊ฐ์๋ฅผ ๋ปํ๋ค.
์ค์ ์ฝ๋ฉ ํ ์คํธ์์ ์ฌ์ฉ๋๋ ๊ตฌํ ๋ถ๋ถ๋ง ์ง๊ณ ๋์ด๊ฐ ๊ฒ์ด๊ธฐ์ ๊ฐ๋จํ๊ฒ ํต์ฌ ์๋ฆฌ๋ง ์์๋ณด์.
1. ๊ตฌํ๊ณ ์ ํ๋ ์ค์ผ๋ฌ ํผ์ ๋ฒ์๋งํผ ๋ฐฐ์ด์ ์ด๊ธฐํ ํ๋ค.
2. 2๋ถํฐ ์์ํ์ฌ, ํ์ฌ ๋ฐฐ์ด์ ๊ฐ๊ณผ ์ธ๋ฑ์ค๊ฐ ๊ฐ๋ค๋ฉด(์์๋ผ๋ฉด) ํ์ฌ ์ ํ๋ ์ซ์์ ๋ฐฐ์์ ํด๋นํ๋ ๋ฐฐ์ด์ ๋๊น์ง ํ์ํ์ฌ P[i] = P[i] - P[i]/k ์ฐ์ฐ์ ์ํํ๋ค.
3. ๋ฐฐ์ด์ ๋๊น์ง 2๋ฒ๊ณผ์ ์ ๋ฐ๋ณตํ์ฌ ์ค์ผ๋ฌ ํผ ํจ์๋ฅผ ์์ฑํ ์ ์๋ค.
๊ณผ์ ์์ฒด๊ฐ ์๋ผํ ์คํ ๋ค์ค์ ์ฒด์ ๋น์ทํ๋ค.
๋ค๋ง, ๊ฑธ๋ฌ๋ด๋ ๋ถ๋ถ์ด P[i] = P[i] - P[i] / k ์ฐ์ฐ์ด ๋ค์ด๊ฐ ๊ฒ๋ง ๋ค๋ฅด๋ค.
์ํ์ ์ธ ์ธก๋ฉด์์ ๊ฐ๋จํ๊ฒ ์ดํดํ ๋ฐ๋ก๋,
"P[i]๋ ๊ทธ ์ ์ดํ์์ ์๋ก์๊ฐ ์๋๋ ํ๋ณด๋ฅผ ์ ๋ถ ์ง์๋ด์ด, ์ค์ ๋ก ์๋ก์๊ฐ ๋๋ ๊ฐ์"
๋ผ๊ณ ์ดํดํ ์ ์์๋ค.
์ค์ผ๋ฌ ํผ ํจ์ ์์
11689๋ฒ: GCD(n, k) = 1
์์ฐ์ n์ด ์ฃผ์ด์ก์ ๋, GCD(n, k) = 1์ ๋ง์กฑํ๋ ์์ฐ์ 1 ≤ k ≤ n ์ ๊ฐ์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
www.acmicpc.net
๋ฌธ์ ์์ ์ํ๋ GCD(n, k) = 1์ ์๋ฏธ๋ ์ต๋ ๊ณต์ฝ์๊ฐ 1๋ฐ์ ์๋ ๊ฒ์ผ๋ก, ์๋ก์์์ ๋ปํ๋ค.
์ฆ, ์ค์ผ๋ฌ ํผ ํจ์๋ฅผ ์ฌ์ฉํ๋ผ๊ณ ๋๋๊ณ ๋งํ๊ณ ์๋ ๊ฒ์ด๋ค.
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
long n = Long.parseLong(br.readLine());
long result = n;
for(long p=2; p<=Math.sqrt(n); p++) {
if (n % p == 0) {
result = result - result / p;
while(n % p == 0) {
n /= p;
}
}
}
if (n > 1) {
result = result - result/n;
}
System.out.println(result);
}
}
- ํ์ฌ ๊ฐ์ด ์์ธ์์ธ์ง ํ์ธํ๊ธฐ ์ํด n%p == 0์ธ์ง ํ์ธํด์ค๋ค.
- ์์ธ์๋ผ๋ฉด, ๊ฐ์ result = rsult - result / p๋ก ์ ๋ฐ์ดํธ ํด์ฃผ์ด ์๋ก์๊ฐ ์๋๋ ๊ฐ์ ์๊ฑฐํด์ค๋ค.
- while(n % p == 0)์ ํตํด์ n๊ฐ์ p ์์ธ์ ๋ด์ญ์ ์์ ์ค๋ค.
- n > 1์ ์์ง ์์ธ์ ๋ด์ญ์ด ๋จ์ ์๋ ๊ฒ์ธ๋ฐ, ์ด๋ n์๊ธฐ ์์ ์ด๋ฏ๋ก, ๋นผ์ฃผ๋ฉด ๋๋ค.
์ ํด๋ฆฌ๋ ํธ์ ๋ฒ
์ ํด๋ฆฌ๋ ํธ์ ๋ฒ์ ์ต๋ ๊ณต์ฝ์๋ฅผ ๊ตฌํ ์ ์๋ ์์ฃผ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ด๋ค.
๋ํ ๊ตฌํด๋ธ ์ต๋ ๊ณต์ฝ์๋ฅผ ํตํด ์ต์ ๊ณต๋ฐฐ์๋ฅผ ์ฝ๊ฒ ๊ตฌํ ์๋ ์๋ค.
1850๋ฒ: ์ต๋๊ณต์ฝ์
๋ชจ๋ ์๋ฆฌ๊ฐ 1๋ก๋ง ์ด๋ฃจ์ด์ ธ์๋ ๋ ์์ฐ์ A์ B๊ฐ ์ฃผ์ด์ง๋ค. ์ด๋, A์ B์ ์ต๋ ๊ณต์ฝ์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค. ์๋ฅผ ๋ค์ด, A๊ฐ 111์ด๊ณ , B๊ฐ 1111์ธ ๊ฒฝ์ฐ์ A์ B์ ์ต๋๊ณต์ฝ์๋ 1์ด๊ณ , A
www.acmicpc.net
import java.nio.Buffer;
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
Scanner sc = new Scanner(System.in);
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
long a = sc.nextLong();
long b = sc.nextLong();
long result = gcd(a, b);
while(result > 0) {
bw.write("1");
result--;
}
bw.flush();
bw.close();
}
public static long gcd(long a, long b) {
if (b == 0) {
return a;
}
else {
return gcd(b, a%b);
}
}
}
- ์์ gcd ํจ์์ ๊ผด์ ์ ํด๋ฆฌ๋ ํธ์ ๋ฒ์ ์ฌ์ฉํ๋ ๊ตฌํ์ ํด๋นํ๋ ๋ถ๋ถ์ด๋ฏ๋ก ๊ผญ ๊ธฐ์ตํด ๋์
์ ํด๋ฆฌ๋ ํธ์ ๋ฒ ์์ ๋ฌธ์
์ต์ ๊ณต๋ฐฐ์๋ง์ ๊ตฌํ๋ ๋ฌธ์ ๋ ๋ช ์์ ๊ฒ์ด๋ค.
์ค์ ๋ก๋ ๋ค์ํ ์๊ณ ๋ฆฌ์ฆ ์ ๋ต๋ค ์ฌ์ด์์ ์ด๋ฌํ ์ ํด๋ฆฌ๋ ํธ์ ๋ฒ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค.
์๋ ์์ ๋ฌธ์ ๋ฅผ ํตํด ์ ํด๋ฆฌ๋ ํธ์ ๋ฒ์ ์ ๋๋ก ์ฌ์ฉํด๋ณด์.
1033๋ฒ: ์นตํ ์ผ
august14๋ ์ธ์์์ ๊ฐ์ฅ ๋ง์๋ ์นตํ ์ผ์ด๋ค. ์ด ์นตํ ์ผ์ ๋ง๋๋ ์ ํํ ๋ฐฉ๋ฒ์ ์์ง ์ธ์์ ๊ณต๊ฐ๋์ง ์์์ง๋ง, ๋ค์ด๊ฐ๋ ์ฌ๋ฃ N๊ฐ๋ ๊ณต๊ฐ๋์ด ์๋ค. ๊ฒฝ๊ทผ์ด๋ ์ธํฐ๋ท ๊ฒ์์ ํตํด์ ์ฌ๋ฃ ์ N
www.acmicpc.net
์ด ๋ฌธ์ ๋ ์นตํ ์ผ์ ์ง๋ ๋น์จ์ ๊ตฌํ๊ณ , ์ต์ ์ง๋์ ๊ตฌํ๋ ๋ฌธ์ ์ด๋ค.
ํด๊ฒฐํ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ผ๋ก๋, ๊ทธ๋ํ ๊ด์ ์์ ์ฌ์ดํด์ด ์๋ ํธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์๊ฐํด์ผ ํ๋ค.
๊ทธ ๊ตฌ์กฐ๋ฅผ ๋ฐํ์ผ๋ก DFS๋ฅผ ์งํํ๋๋ฐ, ์ด ๊ณผ์ ์์ ์ ํด๋ฆฌ๋ ํธ์ ๋ฒ์ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค.
import java.nio.Buffer;
import java.util.*;
import java.io.*;
public class Main {
static ArrayList<cNode>[] A;
static long lcm;
static boolean visited[];
static long D[];
public static void main(String[] args) throws IOException {
Scanner sc = new Scanner(System.in);
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int N = sc.nextInt();
A = new ArrayList[N];
visited = new boolean[N];
D = new long[N];
lcm = 1;
for(int i=0; i<N; i++) {
A[i] = new ArrayList<cNode>();
}
for(int i=0; i<N-1; i++) {
int a = sc.nextInt();
int b = sc.nextInt();
int p = sc.nextInt();
int q = sc.nextInt();
A[a].add(new cNode(b, p, q));
A[b].add(new cNode(a, q, p));
lcm *= (p*q / gcd(p, q));
}
D[0] = lcm;
DFS(0);
long mgcd = D[0];
for(int i=0; i<N; i++) {
mgcd = gcd(mgcd, D[i]);
}
for(int i=0; i<N; i++) {
System.out.print(D[i] / mgcd + " ");
}
}
public static long gcd(long p, long q) {
if (q == 0) {
return p;
} else {
return gcd(q, p%q);
}
}
public static void DFS(int Node) {
visited[Node] = true;
for(cNode i : A[Node]) {
int next = i.getB();
if (!visited[next]) {
D[next] = D[Node] * i.getQ() / i.getP();
DFS(next);
}
}
}
}
class cNode {
int b;
int p;
int q;
public cNode(int b, int p, int q) {
super();
this.b = b;
this.p = p;
this.q = q;
}
public int getB() {
return b;
}
public int getP() {
return p;
}
public int getQ() {
return q;
}
}
- ๋ ธ๋์ ๋น์จ ์ ๋ณด๋ฅผ ๋ด๊ธฐ ์ํด์ cNode ํด๋์ค๋ฅผ ๋ง๋ค์๋ค.
- DFS๋ฅผ ์งํํ๋ฉฐ, ์ฃผ์ด์ง ๋น์จ๋ก ๋ค์ ๋ ธ๋ ๊ฐ์ ๊ฐฑ์ ํ๋ค.
- ์ต์ ๊ณต๋ฐฐ์๋ ๋ ์์ ๊ณฑ์ ์ต๋ ๊ณต์ฝ์๋ก ๋๋ ๊ฒ์ด๋ค.
- DFS๋ฅผ ์ด์ฉํด ์ ๋ฐ์ดํธ ๋ D ๋ฐฐ์ด์ ๊ฐ๋ค์ ์ต๋ ๊ณต์ฝ์๋ฅผ ๊ณ์ฐํ๋ค.
ํ์ฅ ์ ํด๋ฆฌ๋ ํธ์ ๋ฒ
ํ์ฅ ์ ํด๋ฆฌ๋ ํธ์ ๋ฒ์ ๋ชฉ์ ์ ๋ฐฉ์ ์์ ํด๋ฅผ ๊ตฌํ๋ ๊ฒ์ด๋ค.
๊ทธ๋ฌ๋ฉด ์ ์ ํด๋ฆฌ๋ ํธ์ ๋ฒ์ ์ต๋ ๊ณต์ฝ์๋ฅผ ๊ตฌํ๋ ๋ฐฉ๋ฒ์ด๋ผ๊ณ ํ๋ ๊ฒ์ธ๊ฐ. ์๋ก ์๋ฏธ๊ฐ ์์ถฉ๋์ง ์๋๋ ํ ์ ์๋ค.
ํ์ฅ์ ์ฐจ์ด๋ ๋ฐ๋ก ๋ฐฉ์ ์์ ํด๋ฅผ ๊ตฌํ๋๋ฐ, ์ต๋ ๊ณต์ฝ์๋ฅผ ๊ตฌํ๋ ์๊ณ ๋ฆฌ์ฆ์ด ์ฐ์ธ๋ค๋ ๊ฒ์ด๋ค.
ax + by = c์์ c% gcd(a, b) = 0์ธ ๊ฒฝ์ฐ์ ์ ์ ํด๋ฅผ ๊ฐ์ง๋ค.
๋ค์๋งํด, c๊ฐ a์ b์ ์ต๋ ๊ณต์ฝ์์ ๋ฐฐ์์ธ ๊ฒฝ์ฐ์๋ง, ์ ์ํด๋ฅผ ๊ฐ์ง๋ค๋ ๊ฒ์ด๋ค.
ํ์ฅ ์ ํด๋ฆฌ๋ ํธ์ ๋ฒ์ a์ b์ ๋ํด ๊ธฐ์กด์ ์ ํด๋ฆฌ๋ ํธ์ ๋ฒ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ๋๋จธ์ง๊ฐ 0์ด ๋ ๋๊น์ง ๊ณ์ % ์ฐ์ฐ์ ํด์ค๋ค.
๋ค๋ง, ๋ฐ๋ณต์ผ๋ก ๊ตฌํ ๋๋จธ์ง์ ๋ชซ์ ์ด์ฉํ์ฌ, ๊ฑฐ๊พธ๋ก ์ฌ๋ผ๊ฐ๋ฉฐ ์๋ก์ด ์ฐ์ฐ์ ํ๋ค๋ ๊ฒ์ด ๋ค๋ฅด๋ค.
x = y`
y = x` - y`*q
`์ ๊ฐ๊ฐ ์ด์ x์ ์ด์ y๋ฅผ ๋ปํ๋ค. q๋ ๋ชซ์ด๋ค.
์ฒ์ ์์ํ๋ ์ด์ x์ y๋ ๊ฐ๊ฐ 1๊ณผ 0์ผ๋ก ์ง์ ํ๋ค.
์ด๋ ๊ฒ ๊ตฌํ ์ต์ข x์ y๋ ax + bt = gcd(a, b)๋ฅผ ๋ง์กฑํ๋ ๊ฐ์ด๋ผ๋ ๊ฒ์ด๋ค.
* ๋ง์ฝ ์ค๋ฅธ์ชฝ ๋ณ์ ๊ฐ์ด gcd(a, b)์ ๋ฐฐ์๊ฐ ์๋๋ผ๋ฉด, x์ y์ ๊ฐ์ ๋ฒ์๋ ์ ์ ๋ฒ์๊ฐ ์๋ ๊ฒ์ด๋ค.
21568๋ฒ: Ax+By=C
A, B, C๊ฐ ์ฃผ์ด์ก์ ๋, Ax+By=C๋ฅผ ๋ง์กฑํ๋ (x, y)์ค์์ ๋ค์์ ๋ง์กฑํ๋ ๊ฒ์ ์๋ฌด๊ฑฐ๋ ์ฐพ์๋ณด์. x, y๋ ์ ์ -1,000,000,000 ≤ x, y ≤ 1,000,000,000
www.acmicpc.net
import java.nio.Buffer;
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st =new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
int c = Integer.parseInt(st.nextToken());
long gcd = gcd(a, b);
if (c % gcd != 0) {
System.out.println(-1);
} else {
int mok = (int) (c / gcd);
long[] ret = Excute(a, b);
System.out.println(ret[0] * mok + " " + ret[1] * mok);
}
}
public static long[] Excute(long a, long b) {
long[] ret = new long[2];
if (b == 0) {
ret[0] = 1;
ret[1] = 0;
return ret;
}
long q = a / b;
long[] v = Excute(b, a%b);
ret[0] = v[1];
ret[1] = v[0] - v[1] * q;
return ret;
}
public static long gcd(long a, long b) {
while(b != 0) {
long temp = a % b;
a = b;
b = temp;
}
return Math.abs(a);
}
}
- ๋ฐ๋ณต๋ฌธ ํํ๋ก gcd๋ฅผ ๊ตฌํํ ์๋ ์๋ค.
- Excute ํจ์๋ฅผ ํตํด ๋๋จธ์ง๊ฐ 0์ ๋๋ฌํ ๊ฒฝ์ฐ x`=1, y`=0์ผ๋ก ์ค์ ํ๋ค.
- ์ฌ๊ท ํจ์ ํํ๋ก Excute๋ฅผ ์คํํ๊ณ , ์ฐ์ฐํ์ฌ ์ต์ข x์ y์ ๊ฐ์ ๊ตฌํ๋ค.
- c / gcd๋งํผ์ ๊ฐ์ ์ต์ข x์ y์ ๊ณฑํ๋ค.
Reference
- Do it! ์ฝ๋ฉ ํ ์คํธ - ๊ธฐ๋ณธ ํธ
'๐ Knowledge > ์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์๊ณ ๋ฆฌ์ฆ] ์ ๋์จ๊ณผ ํ์ธ๋ ์๊ณ ๋ฆฌ์ฆ(union, find) (0) | 2023.09.07 |
---|---|
[์๊ณ ๋ฆฌ์ฆ] ๋ค์ํ ์ ํ์ ๊ทธ๋ํ ๋ฌธ์ ๋ค (1) | 2023.09.04 |
[์๊ณ ๋ฆฌ์ฆ] ์ ์๋ก - ์์์ ๊ดํ์ฌ (0) | 2023.08.30 |
[์๊ณ ๋ฆฌ์ฆ] ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ (0) | 2023.08.28 |
[์๊ณ ๋ฆฌ์ฆ] ์ ๋ ฌ๋ ๋ฐ์ดํฐ์์์ ํ์, ์ด์ง ํ์ (0) | 2023.08.26 |