白駿1629乗算
https://www.acmicpc.net/problem/1629
平方の性質と型の性質が分かれば,これは容易に解く問題である.
問題はA,B,Cともに2147483647以下の自然数であり,指数を対分処理し,時間複雑度はO(logn)である.
この場合,指数が偶数と奇数の場合を分けて考えるべきである.次の例です.
最初は時間的複雑さを考慮せず,Mathクラスのpow法を用いて簡単に解いた.連続的な誤りが得られ,二乗の性質とモードの性質に関するヒントが得られ,この問題を解決した.何度も試して成功した!
トラブルシューティング
平方の性質と型の性質が分かれば,これは容易に解く問題である.
問題はA,B,Cともに2147483647以下の自然数であり,指数を対分処理し,時間複雑度はO(logn)である.
この場合,指数が偶数と奇数の場合を分けて考えるべきである.次の例です.
10^11 = 10^5 * 10^5 * 10
10^5 = 10^2 * 10^2 * 10
10^2 = 10^1 * 10^1
つまり、指数が偶数の場合は밑^지수/2 * 밑^지수/2
指数が奇数の場合,밑^지수/2 * 밑^지수/2 * 밑
の形態であることがわかる.ソースコード
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
/**
* Math 클래스의 pow 메소드를 이용해서 풀려고 했으나 틀림
* 제곱의 성질을 이용하여 분할정복으로 풀이 -> 시간복잡도 O(logN)
* 힌트 : 지수를 2로 나눔
*/
public class b1629 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
long a = Long.parseLong(st.nextToken());
long b = Long.parseLong(st.nextToken());
long c = Long.parseLong(st.nextToken());
System.out.println(func(a, b, c));
}
public static long func(long a, long b, long c) {
// b가 1일 때
if (b == 1) {
return a % c;
}
long temp = func(a, b / 2, c);
// b가 홀수일 때
if (b % 2 == 1) {
return (temp * temp % c) * a % c;
}
// b가 짝수일 때
return temp * temp % c;
}
}
振り返る
最初は時間的複雑さを考慮せず,Mathクラスのpow法を用いて簡単に解いた.連続的な誤りが得られ,二乗の性質とモードの性質に関するヒントが得られ,この問題を解決した.何度も試して成功した!
イニシャルコード
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class b1629 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
long a = Long.parseLong(st.nextToken());
long b = Long.parseLong(st.nextToken());
long c = Long.parseLong(st.nextToken());
long result = 0;
result = (long) Math.pow(a, b);
System.out.println(result%c);
}
}
Reference
この問題について(白駿1629乗算), 我々は、より多くの情報をここで見つけました https://velog.io/@im_lily/백준-1629-곱셈テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol