해결된 질문
작성
·
17
0
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
링크
http://boj.kr/17a5bc98d39b42d7bc078d2523de17e8
신기한 점은
ll half = myPow(a,b/2);
ll ret = (half * half)%c;
if(b%2) return ret * a % c;
return ret;
이렇게 따로 ret이라는 변수로 빼내면 통과가 됩니다. AI한테 물어봐도 잘못된 답변만 계속하네요(통과하지 못한 코드가 안전한 코드라고 뜹니다)
답변 2
0
안녕하세요 ㅎㅎ
코드 깔끔하구 좋네요 ㅎㅎ
return ((half * half) %c * (a%c))%c;
이부분만 바꿔보시겠어요? half를 곱했을 때 오버플로우가 발생해서 그런 거에요
또 질문 있으시면 언제든지 질문 부탁드립니다.
좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :)
감사합니다.
강사 큰돌 올림.
0
안녕하세요, 인프런 AI 인턴입니다. 안기모님의 질문에 대해 답변 드리겠습니다.
추천해주신 코드는 “거듭 제곱을 빠르게 계산하는 알고리즘”입니다. 이 알고리즘의 핵심은 분할 정복을 사용하여 거듭 제곱의 연산을 효율적으로 수행하는 것입니다. 여기서 중요한 포인트는 문제를 정확히 이해하고 각 단계에서 연산이 어떻게 수행되는지 명확하게 하는 것입니다.
안기모님의 경우, 코드에서 “ret이라는 변수를 따로 계산하면 통과된다”는 점에서 성능이나 정확도가 영향을 받는 것으로 보입니다. 이는 컴파일러의 최적화 문제나, C++에서는 오버플로우 발생 가능성이 원인일 수 있습니다.
ll half = myPow(a, b/2);
: 여기서 b
가 홀수일 때, half * half
연산으로 인해 오버플로우가 없을지 검토하는 것이 중요합니다.ret * a % c
: 이 부분에서는 (ret % c * a % c) % c
로 계산하면 오버플로우를 방지할 수 있습니다. C++에서는 큰 수 연산 시 모듈러 연산을 통해 오버플로우를 예방하는 것이 중요합니다.관련된 질문과 답변을 참고하시면 좀 더 이해를 도울 수 있을 것 같습니다. 특히, if(b % 2)
처럼 홀수 처리 시 오버플로우 문제에 대해 다룬 비슷한 질문들이 있습니다:
이 소스 코드에서 long long
타입을 사용하고 있기 때문에, 연산 중간에 오버플로우가 발생하지 않도록 주의가 필요합니다. 따라서, 모듈러 연산을 충분히 활용하여 안전한 계산 과정을 거치도록 코드를 수정하시길 권장드립니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.