Abordagem e código para a solução o (log n)

f (N) = 0 ^ 0 + 1 ^ 1 + 2 ^ 2 + 3 ^ 3 + 4 ^ 4 + ... + N ^ N.

Eu quero calcular (f (N) mod M)

Essas são as restrições.

1 ≤ N ≤ 10 ^ 91 ≤ M ≤ 10 ^ 3

Aqui está o meu código

test=int(input())
ans = 0

for cases in range(test):
    arr=[int(x) for x in input().split()]
    N=arr[0]
    mod=arr[1]

    #ret=sum([int(y**y) for y in range(N+1)])
    #ans=ret

    for i in range(1,N+1):
        ans = (ans + pow(i,i,mod))%mod
    print (ans)

Eu tentei outra abordagem, mas em vão. Aqui está o código para isso

from functools import reduce
test=int(input())
answer=0
for cases in range(test):
    arr=[int(x) for x in input().split()]
    N=arr[0]
    mod=arr[1]

    answer = reduce(lambda K,N: x+pow(N,N), range(1,N+1)) % M

    print(answer)

questionAnswers(2)

yourAnswerToTheQuestion