이산 로그

시간 제한1초메모리 제한128 MB

요약
소수 P, 밑 B, 목표 N이 주어질 때 B^L ≡ N (mod P)를 만족하는 가장 작은 L을 구하고, 해가 없으면 no solution을 출력한다.
난이도

어려움10점 중 8점

유형
수학, 정수론, 해시맵, 완전 탐색
정답자
아직 제출이 없습니다

문제

소수 PP (2≤P<2312 \le P < 2^{31}), 정수 BB (2≤B<P2 \le B < P), 정수 NN (1≤N<P1 \le N < P)가 주어졌을 때, 밑이 BB이고 법이 PP인 NN의 이산 로그를 구하는 프로그램을 작성하시오.

즉, 다음 조건을 만족하는 정수 LL을 찾으면 된다.

BL≡N(modP)B^L \equiv N \pmod{P}

입력

입력은 여러 개의 테스트 케이스로 이루어진다. 각 테스트 케이스는 한 줄로, PP, BB, NN이 공백으로 구분되어 주어진다. 입력은 파일의 끝까지 계속된다.

출력

각 테스트 케이스마다 NN의 이산 로그를 한 줄에 출력한다. 조건을 만족하는 LL이 여러 개이면 그중 가장 작은 값을 출력한다. 조건을 만족하는 LL이 존재하지 않으면 no solution을 출력한다.

힌트

ACM-ICPC 대회에서는 자주 쓰이지 않는 페르마의 소정리(Fermat's little theorem)를 활용해야 이 문제를 풀 수 있다. 자세한 내용은 페르마의 소정리를 참고하라.

예제1

  1. 예제 1

    입력
    5 2 1
    5 2 2
    5 2 3
    5 2 4
    5 3 1
    5 3 2
    5 3 3
    5 3 4
    5 4 1
    5 4 2
    5 4 3
    5 4 4
    12345701 2 1111111
    1111111121 65537 1111111111
    
    예상 출력
    0
    1
    3
    2
    0
    3
    1
    2
    0
    no solution
    no solution
    1
    9584351
    462803587