#include <bits/stdc++.h>
#define int long long
using namespace std;
int mod, n, inv6, cnt, phi[5000005], vis[5000005], prime[5000005], ans[5000005];
int Qpow(int t, int p)
{
int Ans = 1;
while (p)
{
if (p & 1) Ans = (Ans * t) % mod;
t = (t * t) % mod;
p /= 2;
}
return Ans;
}
int sum2(int x)
{
x %= mod;
return ((x * (x + 1) % mod) * (2 * x + 1) % mod) * inv6 % mod;
}
int sum3(int x)
{
x %= mod;
return ((x * (x + 1) / 2) % mod) * ((x * (x + 1) / 2) % mod) % mod;
}
unordered_map < int, int > m;
int S2(int x)
{
if (x <= 5000000) return ans[x];
if (m.count(x)) return m[x];
int res = sum3(x);
for (int l = 2, r; l <= x; l = r + 1)
{
r = x / (x / l);
res = ((res - (sum2(r) - sum2(l - 1)) * S2(x / l)) % mod + mod) % mod;
}
return m[x] = res;
}
int S(int x)
{
int res = 0;
for (int l = 1, r = 0; l <= x; l = r + 1)
{
r = x / (x / l);
res = (res + (((S2(r) - S2(l - 1)) % mod + mod) % mod) * sum3(x / l)) % mod;
}
res = (res + mod) % mod;
return res;
}
signed main()
{
phi[1] = 1;
for (int i = 2; i <= 5000000; i++)
{
if (!vis[i])
{
prime[++cnt] = i;
phi[i] = i - 1;
}
for (int j = 1; j <= cnt && i * prime[j] <= 5000000; j++)
{
vis[i * prime[j]] = 1;
if (i % prime[j] == 0)
{
phi[i * prime[j]] = phi[i] * prime[j];
break;
}
phi[i * prime[j]] = phi[i] * phi[prime[j]];
}
}
for (int i = 1; i <= 5000000; i++)
ans[i] = (ans[i - 1] + (phi[i] * i % mod) * i) % mod;
cin >> mod >> n;
inv6 = Qpow(6, mod - 2);
cout << S(n) << endl;
return 0;
}