[Baekjoon/λ°±μ€][1009][C/C++] λΆμ°μ²λ¦¬
γλͺ©μ°¨γ
0. κ°μ
1. λ¬Έμ
2. νμ΄
3. μ½λ
0. κ°μ
κ°λ¨νκ² ν릴 μ€ μκ³ νΈκΈ°λ‘κ² νμ΄λκ°μ§λ§, μκ°λ³΄λ€ μκ°μ΄ κ±Έλ Έλ λ¬Έμ μ΄λ€. μ€λλ§μ λ¬Έμ νμ΄λ₯Ό ν΄μ κ·Έλ°κ° λκ° κ΅³μ΄μλ λλ. μ΄ λ¬Έμ μ μΉ΄ν κ³ λ¦¬λ 'μν'κ³Ό 'ꡬν'μ΄λ€. 'κ°μ μλ₯Ό 무νν κ³±ν΄λκ° μ, μΌμ μ리λ μ΅λ 4μ£ΌκΈ°λ‘ κ°μ μκ° λ°λ³΅λλ€'λΌλ μνμ μ리λ₯Ό κΉ¨λ¬μΌλ©΄ λ¬Έμ λ μ½κ² νλ¦°λ€.
1. λ¬Έμ
https://www.acmicpc.net/problem/1009
[λ¬Έμ ]
μ¬μ©μ΄λ μ΅μ μ»΄ν¨ν° 10λλ₯Ό κ°μ§κ³ μλ€. μ΄λ λ μ¬μ©μ΄λ λ§μ λ°μ΄ν°λ₯Ό μ²λ¦¬ν΄μΌ λ μΌμ΄ μ겨μ κ° μ»΄ν¨ν°μ 1λ²λΆν° 10λ²κΉμ§μ λ²νΈλ₯Ό λΆμ¬νκ³ , 10λμ μ»΄ν¨ν°κ° λ€μκ³Ό κ°μ λ°©λ²μΌλ‘ λ°μ΄ν°λ€μ μ²λ¦¬νκΈ°λ‘ νμλ€.
1λ² λ°μ΄ν°λ 1λ² μ»΄ν¨ν°, 2λ² λ°μ΄ν°λ 2λ² μ»΄ν¨ν°, 3λ² λ°μ΄ν°λ 3λ² μ»΄ν¨ν°, ... ,
10λ² λ°μ΄ν°λ 10λ² μ»΄ν¨ν°, 11λ² λ°μ΄ν°λ 1λ² μ»΄ν¨ν°, 12λ² λ°μ΄ν°λ 2λ² μ»΄ν¨ν°, ...
μ΄ λ°μ΄ν°μ κ°μλ νμ abκ°μ ννλ‘ μ£Όμ΄μ§λ€. μ¬μ©μ΄λ λ¬Έλ λ§μ§λ§ λ°μ΄ν°κ° μ²λ¦¬λ μ»΄ν¨ν°μ λ²νΈκ° κΆκΈν΄μ‘λ€. μ΄λ₯Ό μνν΄ μ£Όλ νλ‘κ·Έλ¨μ μμ±νλΌ.
[μ λ ₯]
μ λ ₯μ 첫 μ€μλ ν μ€νΈ μΌμ΄μ€μ κ°μ Tκ° μ£Όμ΄μ§λ€. κ·Έλ€μ μ€λΆν° κ°κ°μ ν μ€νΈ μΌμ΄μ€μ λν΄ μ μ aμ bκ° μ£Όμ΄μ§λ€. (1 ≤ a < 100, 1 ≤ b < 1,000,000)
[μΆλ ₯]
κ° ν μ€νΈ μΌμ΄μ€μ λν΄ λ§μ§λ§ λ°μ΄ν°κ° μ²λ¦¬λλ μ»΄ν¨ν°μ λ²νΈλ₯Ό μΆλ ₯νλ€.
[μμ μ λ ₯ 1]
5
1 6
3 7
6 2
7 100
9 635
[μμ μΆλ ₯ 1]
1
7
6
1
9
2. νμ΄
[λ¬Έμ μ΄ν΄]
1λ², 11λ², 21λ², 31λ², ... ν΄μ λμ리(=μΌμμ리)κ° 1μΈ λ°μ΄ν°λ€μ 1λ² μ»΄ν¨ν°κ° μ²λ¦¬.
2λ², 12λ², 22λ², 32λ², ... ν΄μ λμ리(=μΌμμ리)κ° 2μΈ λ°μ΄ν°λ€μ 2λ² μ»΄ν¨ν°κ° μ²λ¦¬.
3λ², 13λ², 23λ², 33λ², ... ν΄μ λμ리(=μΌμμ리)κ° 3μΈ λ°μ΄ν°λ€μ 3λ² μ»΄ν¨ν°κ° μ²λ¦¬.
...
9λ², 19λ², 29λ², 39λ², ... ν΄μ λμ리(=μΌμμ리)κ° 9μΈ λ°μ΄ν°λ€μ 9λ² μ»΄ν¨ν°κ° μ²λ¦¬.
10λ², 20λ², 30λ², 40λ², ... ν΄μ λμ리(=μΌμμ리)κ° 0μΈ λ°μ΄ν°λ€μ 10λ² μ»΄ν¨ν°κ° μ²λ¦¬.
μ¦, λ°μ΄ν°μ κ°μλ₯Ό μλ©΄, λ§μ§λ§μ μ²λ¦¬λ λ°μ΄ν°μ λ²νΈλ₯Ό μκ² λκ³ , ν΄λΉ λ°μ΄ν°μ λμ리(=μΌμμ리)λ₯Ό μκ² λλ©΄, λͺ λ² μ»΄ν¨ν°κ° ν΄λΉ λ°μ΄ν°λ₯Ό μ²λ¦¬ν μ§ μκ² λλ€.
∴ μ λ ₯λ°μ΄ν°μ λμ리(=μΌμμ리)λ₯Ό μμλ΄λ©΄ λ¬Έμ λ νλ¦¬κ² λλ€.
[μ λ ₯ λ°μ΄ν° νμ]
Tλ ν μ΄μ€ μΌμ΄μ€μ κ°μ. μ¦, μ λ ₯ λ°μ΄ν°μ κ°μμ΄λ€.
aλ λ°.
bλ μ§μ.
∴ $a^b$κ°μ λμ리(=μΌμμ리)λ₯Ό μμλ΄λ©΄ λλ€.
[μ§κ΄μ μΈ νμ΄1] = μ€λ²νλ‘μ°(Overflow) λ°μ.
(int)pow(a,b) % 10
λ¨μνκ², math.h λΌμ΄λΈλ¬λ¦¬μ μ‘΄μ¬νλ pow() ν¨μλ₯Ό μ΄μ©νμ¬ $a^b$κ°μ ꡬνκ³ , ν΄λΉκ°μ λμ리(=μΌμμ리)λ₯Ό ꡬνλ©΄ μ΄λ¨κΉ? aμ μ΅λκ°μ 99, bμ μ΅λκ°μ 999,999 μ΄λ―λ‘ pow(99, 999999)μ κ°μ κ±°μ $100^{10^6}$μΌλ‘ κ·Έ κ°μ΄ μ΄λ§λ¬΄μνκ² μ»€μ§λ€. μ΄λ νΉμ μλ£νμ΄ κ°λΉν μ μλ ν¬κΈ°μ λ°μ΄ν°κ° μλλ―λ‘, μ»΄ν¨ν°λ μ€λ²νλ‘μ°(Overflow) μ€λ₯λ₯Ό λ°μμν€κ² λλ€.
[μ§κ΄μ μΈ νμ΄2] = μκ°λ³΅μ‘λ O(n). μ΄ λ°©μμΌλ‘ νκ²λλ©΄ μκ°μ΄κ³Όλ‘ μ€λ΅ μ²λ¦¬λλ€.
#pragma warning(disable:4996) //visual studio scanf μ€λ₯ λ°©μ§.
#include <stdio.h>
int get_units(int a, int b) {
int units = a % 10;
for (int i = 1; i < b; i++)
units = (units * a) % 10;
/*
units = ( units * (a%10) ) % 10
μ μμΌλ‘ κ³μ°ν΄λ λλ€.
*/
return units;
}
int main(int argc, char* argv[]) {
/* λ³μμ μΈ */
int a, b, T;
/* μ
λ ₯κ° λ°μ ν μ°μ° */
scanf("%d", &T);
for (int i = 0; i < T; i++) {
scanf("%d %d", &a, &b);
printf("%d\n", get_units(a, b) == 0 ? 10 : get_units(a, b));
}
return 0;
}
μ μ½λμμ get_units(int a, int b) ν¨μλ aμ bλ₯Ό μ λ ₯κ°μΌλ‘ λ°μ, $a^b$μ λμ리(=μΌμμ리) μλ₯Ό λ°νν΄ μ£Όλ ν¨μμ΄λ€.
[μ§κ΄μ μΈ νμ΄1]μμ λ°μν μ€λ²νλ‘μ° λ°©μ§λ₯Ό μν΄, %10 μ°μ°μ ν΅ν΄ κ°μ ν¬κΈ°λ₯Ό μ€μ¬μ£Όκ³ μλ€. λ€λ§, μ΄ λ°©μμ κ²½μ° λ³μ bμ λν΄ O(n)μ μ νμ μΈ μκ°λ³΅μ‘λλ₯Ό μ§λλ€. μ¦, bμ ν¬κΈ°κ° μ»€μ§ κ²½μ° μκ°λ³΅μ‘λλ κ·Έμ λΉλ‘νμ¬ μ¦κ°νλ€.
μμλ μ νμ΄λλ‘ λ°±μ€μ μ±μ μ μμ²ν κ²°κ³Ό, μκ°μ΄κ³Όκ° λ°μνλ€.
O(n)μμ μκ°λ³΅μ‘λλ₯Ό λμ± μ€μ¬μΌ νλλ°, μλ μμ ν μνμ μ리λ₯Ό μ΄μ©νλ O(1) μμμκ° λ΄λ‘ λ¬Έμ κ° νλ Έλ€.
[μ λ΅] = μκ°λ³΅μ‘λ O(1)
κ³ λ―Όμ ν΄λ³΄μ. μ°λ¦¬κ° ꡬν΄μΌ ν κ°μ $a^b$μ λμ리(=μΌμμ리) μ΄λ€.
$a^b$λ aλ κ°μ bλ² κ³±νμ λ μ»μ΄μ§λ μμ΄λ€, bλ²μ κ³±μ μ λ°λ³΅νμ λ, μΌμμ리 μμ λ³νμλ κ·μΉμ΄ μ‘΄μ¬ν κΉ?
[b%4=1] 1λ², 5λ², 9λ², .. |
[b%4=2] 2λ², 6λ², 10λ², .. |
[b%4=3] 3λ², 7λ², 11λ², .. |
[b%4=0] 4λ², 8λ², 12λ², .. |
|
μΌμμ리 = 0 | 0 | 0 | 0 | 0 |
μΌμμ리 = 1 | 1 | 1 | 1 | 1 |
μΌμμ리 = 2 | 2 | 4 | 8 | 6 |
μΌμμ리 = 3 | 3 | 9 | 7 | 1 |
μΌμμ리 = 4 | 4 | 6 | 4 | 6 |
μΌμμ리 = 5 | 5 | 5 | 5 | 5 |
μΌμμ리 = 6 | 6 | 6 | 6 | 6 |
μΌμμ리 = 7 | 7 | 9 | 3 | 1 |
μΌμμ리 = 8 | 8 | 4 | 2 | 6 |
μΌμμ리 = 9 | 9 | 1 | 9 | 1 |
μ νλ₯Ό ν΅ν΄ 'κ°μ μλ₯Ό 무νν κ³±ν΄λκ° μ, μΌμμ리λ μ΅λ 4μ£ΌκΈ°λ‘ κ°μ μκ° λ°λ³΅λλ€' λΌλ μ¬μ€μ κΉ¨λ¬μ μ μλ€.
λ°λΌμ, μ νμ κ°μ λ°°μ΄μ 미리 λ§λ€μ΄ λ ν, aμ bμ μ μ ν μ°μ°μ ν΅ν΄ κ°μ μλ‘ λ§€μΉμν€λ©΄ O(1)μ μκ° λ΄λ‘ λ¬Έμ κ° νλ¦¬κ² λλ€.
λ¨, μ λ΅ μ½λμ λ§λ€μ΄λ ν μ΄λΈ = table[10][4] μ κ°μ΄ λ€μκ³Ό κ°μ ννλ‘ μ μ₯λ¨μ μ μ λ°λλ€.
[b%4=0] 4λ², 8λ², 12λ², .. |
[b%4=1] 1λ², 5λ², 9λ², .. |
[b%4=2] 2λ², 6λ², 10λ², .. |
[b%4=3] 3λ², 7λ², 11λ², .. |
|
μΌμμ리 = 0 | 0 [0][0] | 0 [0][1] | 0 [0][2] | 0 [0][3] |
μΌμμ리 = 1 | 1 [1][0] | 1 [1][1] | 1 [1][2] | 1 [1][3] |
μΌμμ리 = 2 | 6 [2][0] | 2 ... | 4 | 8 |
μΌμμ리 = 3 | 1 [3][0] | 3 | 9 | 7 |
μΌμμ리 = 4 | 6 [4][0] | 4 | 6 | 4 |
μΌμμ리 = 5 | 5 [5][0] | 5 | 5 | 5 |
μΌμμ리 = 6 | 6 [6][0] | 6 | 6 | 6 |
μΌμμ리 = 7 | 1 [7][0] | 7 | 9 | 3 |
μΌμμ리 = 8 | 6 [8][0] | 8 | 4 | 2 |
μΌμμ리 = 9 | 1 [9][0] | 9 | 1 | 9 |
[μ£Όμν μ ]
μΌμ μ리 μκ° 0μ΄λΌλ©΄, μ΄λ 10λ²μ§Έ μ»΄ν¨ν°κ° μ²λ¦¬νλ κ°μ΄λ€. 0λ²μ§Έ μ»΄ν¨ν°κ° μ²λ¦¬νλ κ°μ΄ μλλ€...μ΄κ² λλ¬Έμ λͺ λ² νλ Έλ€. μ‘°μ¬νμ.
3. μ½λ
#pragma warning(disable:4996) //visual studio scanf μ€λ₯ λ°©μ§.
#include <stdio.h>
int table[10][4]; //ν
μ΄λΈ λ§λ€κΈ°
int power(int a, int b) { //κ±°λμ κ³± ν¨μ
if (b == 0)
return 1;
else
return power(a, b - 1) * a;
}
void make_table(void) { //ν
μ΄λΈ μ±μλ£κΈ°
for (int i = 0; i < 10; i++)
for (int j = 1; j <= 4; j++)
table[i][j % 4] = (int)power(i, j) % 10;
/*
math.hμ pow()λ₯Ό μ΄μ©νμ¬,
table[i][j % 4] = (int)pow(i, j) % 10;
μΌλ‘ ꡬνν΄λ λλ€.
(math.h ν¨μλ λ°ννμ΄ doubleμ΄λ―λ‘, intλ‘ νλ³ν ν΄μ€λ€.)
*/
}
int main(int argc, char* argv[]) {
/* λ³μμ μΈ */
int a, b, T;
/* ν
μ΄λΈ λ§λ€κΈ° */
make_table();
/* μ
λ ₯κ° λ°μ ν μ°μ° */
scanf("%d", &T);
for (int i = 0; i < T; i++) {
scanf("%d %d", &a, &b);
printf("%d\n", table[a % 10][b % 4] == 0 ? 10 : table[a % 10][b % 4]);
}
return 0;
}