以下のような方針は,いずれも という制約の下では制限時間に間に合わないと思います.
上記の方針では,「各 に対して, より小さい について, に をかける」という操作を行っていました.
操作の見方を変えて,「各 に対して, より大きい について, に をかける」という操作を行う以下のような方針を考えてみます.
この方針の計算量を評価します.ある に対して 以下の正の整数のうち の倍数であるものの個数は です.
よって, に対して考える場合の計算量は となりますが,これは と等しいです(調和級数).
一見すると操作の見方を変えただけですが,計算量が改善されたことにより問題を解くことができます.
これは,約数を探索する場合には素因数分解の際に約数でない数も探索する必要があるため,無駄な計算時間がかかってしまうことに起因します.
xxxxxxxxxx
N,X = map(int,input().split())
MOD = 10**9+7
A = [1]*(N+1)
ans = 0
for i in range(1,N+1):
A[i] *= i if i>1 else X
A[i] %= MOD
j = 2*i
while j<=N:
A[j] *= A[i]
A[j] %= MOD
j += i
ans += A[i]
ans %= MOD
print(ans)