1 λΆ„ μ†Œμš”

πŸ“ [S1_1629] κ³±μ…ˆ

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
	static long C;
	public static void main(String[] args) throws IOException{
		BufferedReader br = new  BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
		
		long A = Integer.parseInt(st.nextToken());
		long B = Integer.parseInt(st.nextToken());
		C = Integer.parseInt(st.nextToken());
		
		System.out.println(pow(A,B));
		
		}
	
	static long pow(long a, long b) {
		if(b==1) {
			return a % C;
		}
		
		// μ§€μˆ˜λ₯Ό 1/2 ν•œ 값을 ꡬ해주기 -> μ§€μˆ˜ 법칙 a^b = a^b/2 * a^b/2
		long temp = pow(a, b/2);
		
		// μ§€μˆ˜κ°€ ν™€μˆ˜ 일 경우
		// λͺ¨λ“ˆλŸ¬ 법칙 (a * b) % c = ((a%c) * (b%c))%c
		if(b % 2 == 1) {
			return (temp * temp % C) * a % C ;
		}
		
		// 짝수 인 경우
		return temp * temp % C;
		
	}
	
}

πŸ€” λ‚˜μ˜ 생각

문제만 보면 κ°„λ‹¨ν•œ λ¬Έμ œμ§€λ§Œ 수의 λ²”μœ„μ™€ μ‹œκ°„λ³΅μž‘λ„λ₯Ό μƒκ°ν•˜λ©΄ κ·Έλ ‡κ²Œ κ°„λ‹¨ν•œ λ¬Έμ œλŠ” μ•„λ‹ˆμ˜€λ˜ 것 κ°™λ‹€.
κ°„λ‹¨νžˆ μƒκ°ν•˜λ©΄ Bμ œκ³±ν•΄μ„œ C둜 λ‚˜λˆ μ£ΌλŠ” λ‚˜λ¨Έμ§„λ° μ‹œκ°„μ΄ 0.5초기 λ•Œλ¬Έμ— A,B,C의 λ²”μœ„λ₯Ό λ΄μ„œλŠ” λΆˆκ°€λŠ₯ν•˜λ‹€.
κ·Έλž˜μ„œ 생각해 λ‚΄μ•Όν•˜λŠ” 방법은 μ§€μˆ˜ 법칙과 λͺ¨λ“ˆλŸ¬ 법칙이닀.
λ¨Όμ € μ§€μˆ˜ 법칙은 2의 4μŠΉμ€ 2의 2승 κ³±ν•˜κΈ° 2의 2승으둜 λ‚˜λˆ μ§„λ‹€λŠ” κ±°κ³ ,
λͺ¨λ“ˆλŸ¬ 연산은 (a * b) % c = ((a%c) * (b%c))%c 이 곡식이 μ„±λ¦½ν•œλ‹€λŠ” 것이닀.
κ·Έλž˜μ„œ λ¨Όμ € pow λΌλŠ” λ©”μ„œλ“œμ— μ§€μˆ˜κ°€ 1인 κ²½μš°μ—λŠ” κ·Έλƒ₯ Aμ—μ„œ Cλ₯Ό λ‚˜λˆˆ λ‚˜λ¨Έμ§€λ₯Ό 리턴해주고
μ§€μˆ˜κ°€ ν™€μˆ˜ 인 κ²½μš°μ—λŠ” μ§€μˆ˜ 법칙을 μ‹œν–‰ν•œ 수끼리 κ³±ν•΄μ£Όκ³  λ§ˆμ§€λ§‰μ— μ›λž˜ 값을 ν•œλ²ˆλ” κ³±ν•΄μ£ΌλŠ” 것이닀. 그리고 거기에 λͺ¨λ“ˆλŸ¬ 연산을 μ΄μš©ν•΄ 값을 κ΅¬ν–ˆλ‹€.
λ§ˆμ§€λ§‰ 짝수 인 κ²½μš°μ—λŠ” μ§€μˆ˜λ²•μΉ™μ— λͺ¨λ“ˆλ € 연산을 μ‹œν–‰ν•˜μ—¬ 값을 κ΅¬ν•΄μ£Όμ—ˆλ‹€.
λ‚˜λ„ μ§€μˆ˜ 법칙과 λͺ¨λ“ˆλŸ¬ 연산을 λ– μ˜¬λ¦¬μ§€ λͺ»ν•΄ 찾아보닀가 μ•Œκ²Œλœ 것인데 μ°Έ.. μˆ˜ν•™κ³΅μ‹λ„ 많이 μ•Œκ³  μžˆμ–΄μ•Ό 도움이 될 것 κ°™λ‹€..γ