publicstaticvoidmain(String[] args)throws Exception { BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out)); BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(in.readLine()); out.write("" + tileOf2xn2(n)); out.write("\n"); out.flush(); out.close(); in.close(); } publicstaticinttileOf2xn2(int n){ int[] dp = newint[n+1]; dp[0] = 1; dp[1] = 1; for (int i = 2; i <= n; i++) { dp[i] = (dp[i-1] + (2*dp[i-2])) % 10007; } return dp[n]; } }
publicstaticvoidmain(String[] args)throws Exception { BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out)); BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(in.readLine()); out.write("" + tileOf2xn(n)); out.write("\n"); out.flush(); out.close(); in.close(); } publicstaticinttileOf2xn(int n){ int[] dp = newint[n+1]; dp[0] = 1; dp[1] = 1; for (int i = 2; i <= n; i++) { dp[i] = (dp[i-1] + dp[i-2]) % 10007; } return dp[n]; } }
publicstaticvoidmain(String[] args)throws Exception { BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out)); BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(in.readLine()); out.write("" + makeItOne(n)); out.write("\n"); out.flush(); out.close(); in.close(); } publicstaticintmakeItOne(int n){ int[] table = newint[n + 1]; table[1] = 0; for (int i = 2; i <= n; i++) { table[i] = table[i - 1] + 1; if (i % 2 == 0 && table[i] > table[i / 2] + 1) { table[i] = table[n / 2] + 1; } elseif (i % 3 == 0 && table[i] > table[i / 3] + 1) { table[i] = table[n / 3] + 1; } } return table[n]; } //짧은 코드 publicstaticintmakeItOne2(int n){ int[] dp = newint[n + 1]; for (int i = 2; i <= n; i++) { dp[i] = Math.min(dp[i / 2] + (i % 2), dp[i / 3] + (i % 3)) + 1; } return dp[n]; } }
public static void main(String[] args) throws Exception { g2(); }
public static void g2() throws Exception { BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out)); BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); String str = in.readLine(); String[] split = str.split(" "); int n = Integer.parseInt(split[0]); int s = Integer.parseInt(split[1]);
String str2 = in.readLine(); String[] split2 = str2.split(" "); int[] a = new int[n];
for (int i = 0; i < n; i++) { int x = Integer.parseInt(split2[i]); a[i] = Math.abs(x-s); }
int result = a[0]; for (int i = 1; i < n; i++) { result = gcd(result, a[i]); }
Posted onEdited onInComputer
,
CodingTestDisqus: Symbols count in article: 1.4kReading time ≈1 mins.
[BaekJoon-9613] GCD 합
문제
양의 정수 n개가 주어졌을 때, 가능한 모든 쌍의 GCD의 합을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 테스트 케이스의 개수 t (1 ≤ t ≤ 100)이 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있다. 각 테스트 케이스는 수의 개수 n (1 < n ≤ 100)가 주어지고, 다음에는 n개의 수가 주어진다. 입력으로 주어지는 수는 1,000,000을 넘지 않는다.
출력
각 테스트 케이스마다 가능한 모든 쌍의 GCD의 합을 출력한다.
예제 입력 1
1 2 3 4
3 4 10 20 30 40 3 7 5 12 3 125 15 25
예제 출력 1
1 2 3
70 3 35
해결
최대공약수는 유클리드 호재법을 이용했다. 여기서 최대공약수의 합이라고 되어있는데 가능한 모든 쌍이라는 것이
10 20 30 40
이 있다면 10, 20, 30, 40 의 최대굉약수 합
20, 30, 40 의 최대공약수 합
30, 40 의 최대공약수 합
이 된다.
그래서 루프를 두 번 돌려야하며 i 는 i to n - 1번 만큼 루프를 (왜냐하면 마지막 값은 하나 뿐이니..) j 는 i + 1 to n번 만큼 루프를 돌린다.
publicstaticvoidsumOfGCD()throws Exception { BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out)); BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); int t = Integer.parseInt(in.readLine());
while (t-- != 0) { String s = in.readLine(); String[] split = s.split(" "); int n = Integer.parseInt(split[0]); long sum = 0; for (int i = 1; i <= n - 1; i++) { for (int j = i + 1; j <= n; j++) { sum += gcd(Integer.parseInt(split[i]), Integer.parseInt(split[j])); } } out.write(sum + "\n"); out.flush(); } out.close(); in.close(); }
publicstaticlonggcd(int a, int b){ while (b != 0) { int r = a % b; a = b; b = r; } return a; } }
Posted onEdited onInComputer
,
CodingTestDisqus: Symbols count in article: 1.8kReading time ≈2 mins.
[BaekJoon-6588] 골드바흐의 추측
문제
1742년, 독일의 아마추어 수학가 크리스티안 골드바흐는 레온하르트 오일러에게 다음과 같은 추측을 제안하는 편지를 보냈다.
4보다 큰 모든 짝수는 두 홀수 소수의 합으로 나타낼 수 있다. 예를 들어 8은 3 + 5로 나타낼 수 있고, 3과 5는 모두 홀수인 소수이다. 또, 20 = 3 + 17 = 7 + 13, 42 = 5 + 37 = 11 + 31 = 13 + 29 = 19 + 23 이다.
이 추측은 아직도 해결되지 않은 문제이다.
백만 이하의 모든 짝수에 대해서, 이 추측을 검증하는 프로그램을 작성하시오.
입력
입력은 하나 또는 그 이상의 테스트 케이스로 이루어져 있다. 테스트 케이스의 개수는 100,000개를 넘지 않는다.
각 테스트 케이스는 짝수 정수 n 하나로 이루어져 있다. (6 ≤ n ≤ 1000000)
입력의 마지막 줄에는 0이 하나 주어진다.
출력
각 테스트 케이스에 대해서, n = a + b 형태로 출력한다. 이때, a와 b는 홀수 소수이다. 숫자와 연산자는 공백 하나로 구분되어져 있다. 만약, n을 만들 수 있는 방법이 여러 가지라면, b-a가 가장 큰 것을 출력한다. 또, 두 홀수 소수의 합으로 n을 나타낼 수 없는 경우에는 “Goldbach’s conjecture is wrong.”을 출력한다.
예제 입력 1
1 2 3 4
8 20 42 0
예제 출력 1
1 2 3
8 = 3 + 5 20 = 3 + 17 42 = 5 + 37
풀이방법
에라토스테네스의 체를 가지고 소수 배열을 만들어놓고 소수배열이면서 n-1번 째 배열이 소수이면 두 소수의 합을 구할 수 있다.
publicstaticvoidgoldbachsConjecture()throws Exception { BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out)); BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
int length = 1000000; boolean[] check = newboolean[length + 1]; check[0] = check[1] = true; for (int i = 2; i <= length; i++) { if (!check[i]) for (int j = i + i; j <= length; j += i) check[j] = true; }
int n = 0; int a; boolean flags; while ((n = Integer.parseInt(in.readLine())) != 0) { a = 2; flags = false; for (int i = a; i < n; i++) { if (!check[i] && (!check[i] && !check[n - i])) { out.write(n + " = " + i + " + " + (n - i) + "\n"); flags = true; break; } } if (!flags) out.write("Goldbach's conjecture is wrong."); out.flush(); }
Posted onInComputer
,
CodingTestDisqus: Symbols count in article: 1.3kReading time ≈1 mins.
[BaekJoon-1929] 소수구하기
문제
M이상 N이하의 소수를 모두 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 자연수 M과 N이 빈 칸을 사이에 두고 주어진다. (1 ≤ M ≤ N ≤ 1,000,000)
출력
한 줄에 하나씩, 증가하는 순서대로 소수를 출력한다.
예제 입력 1
1
3 16
예제 출력 1
1 2 3 4 5
3 5 7 11 13
풀이
일반 소수구하기로 하면 시간초과난다.
그래서 에라토스테네스의 체를 이용하여 문제를 해결할 수 있다.
고대 그리스의 수학자 에라토스테네스가 만들어 낸 소수를 찾는 방법. 이 방법은 마치 체로 치듯이 수를 걸러낸다고 하여 ‘에라토스테네스의 체’라고 부른다. 따지고 보면 $f(x)=x1_P(x)$ 의 수열 중 0이 아닌 것을 표로 시각화한 것이라고 볼 수 있다. 참조 : 나무위키
publicstaticvoidprime()throws Exception { BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out)); BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); String str = in.readLine(); String[] split = str.split(" "); int m = Integer.parseInt(split[0]); int n = Integer.parseInt(split[1]);
int[] num = newint[n + 1]; boolean[] check = newboolean[n + 1]; for (int i = 0; i <= n; i++) { num[i] = i; } check[0] = check[1] = true; for (int i = 2; i <=n; i++) { if (!check[i]) for (int j = i + i; j <= n; j+=i) check[j] = true; }
for (int i = m; i <=n; i++) { if (!check[i]) out.write(num[i] + "\n"); } out.flush(); out.close(); in.close(); } }
publicstaticvoidmain(String[] args)throws Exception { BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out)); BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); String str = in.readLine(); String[] split = str.split(" "); int a = Integer.parseInt(split[0]); int b = Integer.parseInt(split[1]); int gcd = gcd(a, b); out.write(gcd + "\n"); out.write(lcm(a, b, gcd) + "\n"); out.flush(); out.close(); ; in.close(); ; }
publicstaticintgcd(int a, int b){ while (b != 0) { int r = a % b; a = b; b = r; } return a; } //재귀를 이용한 gcd publicstaticlonggcd2(long a, long b){ return b != 0 ? gcd(b, a % b) : a; }
publicstaticintlcm(int a, int b, int gcd){ return (a * b) / gcd; } }
publicstaticvoidsuffixOfArray()throws Exception { BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out)); BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); String str = in.readLine(); String[] arr = new String[str.length()];
for (int i = 0; i<str.length(); i++) { arr[i] = str.substring(i); } Arrays.sort(arr); for (String s : arr) { out.write(s+'\n'); } out.flush(); out.close();; in.close(); } }