scared22   2년 전

11부터 해도 문제가 없을 것같은데 또 에러가 있네요 ㅡㅡ;;

pichulia   2년 전

10번 컴퓨터는 10이 나와야합니다...ㅠㅠ

scared22   2년 전

#include <iostream>

using namespace std;
int main()
{
int Case, a, b;
int result = 1;

cin >> Case;

for (int i = 0; i < Case; i++)
{
cin >> a >> b;
if (b != 10)
a = a % 10, b = b % 10;
for (int j = 0; j < b; j++)
{
result = result * a;
}
if (a % 10 == 0)
cout << 10 << endl;
else
cout << result % 10 << endl;
a = 0, b = 0, result = 1;
}

}

예외 처리를 해줘도 틀렸대요 ㅜㅜ

pichulia   2년 전


result = result * a;

이럴 필요가 있나요?

어차피 끝의 숫자만 볼텐데 말이죠...

result = (result * a)%10; 으로 바꿔줄 필요가 있습니다.

현재 a가 99, b가 999999 로 들어가게 되면

result 값이 10^1000000 언저리로 갈텐데

이 수치는 지구에 있는 원자의 개수보다 훨씬 많은 수치입니다.

이런 숫자를 저장할 수 있는 공간이 컴퓨터에는 없죠...

pichulia   2년 전

조금 안전하게 가려고 지구에 있는 원자의 개수라고 했는데

높게 쳐봐야 지구에 있는 원자의 개수는 10^54 개밖에 안되네요..

맙소사...

물리학자들이 예측하는, 우주에 있는 별의 개수는 10^22개 정도라고 합니다.

그럼 좀 더 스케일을 크게 잡도 될듯 합니다......

전 우주에 있는 원자의 개수도 지금 result에 저장하려는 값보다 작을거 같네요;

RiKang   2년 전

b = b % 10 은 이렇게 해도 정답이 된다고 증명하고 사용하신 건가요???

RiKang   2년 전

ab 와 a b%10 을 10으로 나눈 나머지가 같다는 보장은 없습니다.

저게 성립하려면 a10을 10으로 나눈 나머지가 항상 1이 됨을 보여야 하는데

( a1 * a10 = a11 이니 a11 과 a1 이 10으로 나눈 나머지가 같으려면 a10을 10으로 나눈 나머지가 항상 1 이어야 하죠)

a = 2 인 경우를 봐도 바로 반례가 됩니다.

저 지수 자체를 줄이기 위해선 오일러 피 함수 ( 1부터 n까지의 양의 정수 중에 n과 서로소인 것의 개수 ) 를 구해서

오일러의 정리에 의해 b = b % 오일러 피 함수 ( 10 ) 이런 방식으로 만들 수 있습니다.

오일러 피 함수 : http://ko.wikipedia.org/wiki/%EC%98%A4%EC%9D%BC%EB...

오일러의 정리 : http://ko.wikipedia.org/wiki/%EC%98%A4%EC%9D%BC%EB...

사실 이 문제는 이런 거 안쓰고 그냥 하거나 아니면 그때 그때 a에 따라서 반복되는 주기를 찾아주면 해결 할 수 있고 사실 오일러의 정리는

프로그래밍 대회 쪽에서는 거의 쓸 일이 없고 특수한 경우 ( 페르마의 소정리 )만 좀 나옵니다./

scared22   2년 전

result = (result*a)%10 result= result *a 랑 비슷하지만 다르네요 와 대단 하십니다.

RiKang님 말씀대로 b = b%10 을 제거 하니 바로 정답이 뜨네요 ㅎㅎ 감사합니다

아직까지 b= b%10을 하면 왜 에러인지는 모르겠지만 한번 찾아보겠습니다 도와 주셔서 감사합니다 ㅎㅎ

댓글을 작성하려면 로그인해야 합니다.