CODe
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const ll Maxn=1e7+7;
ll n,p,phi[Maxn],ans,S[Maxn],inv;
int prime[Maxn],cnt;
bool isprime[Maxn];
map<ll,ll>Phi;
inline ll ksm(ll a,ll b,ll mod){
ll z=1;
while(b){
if(b&1) z=z*a%mod;
a=a*a%mod;
b>>=1;
}
return z;
}
inline ll f3(ll x){
return (x*(x+1)/2)*(x*(x+1)/2)%p;
}
inline ll f2(ll x){
return (x*(x+1)%p*(2*x+1)%p*inv%p);
}
inline void EulerSieve(ll N){
isprime[1]=isprime[0]=1;
for(ll i=2;i<=N;i++){
if(!isprime[i]) prime[++cnt]=i,phi[i-1];
for(ll j=1;j<=cnt&&prime[j]*i<=N;j++){
isprime[i*prime[j]]=1;
if(!(i%prime[j])){
phi[i*prime[j]]=phi[i]*prime[j];
break;
}
phi[i*prime[j]]=phi[i]*(prime[j]-1);
}
}
for(ll i=1;i<=N;i++) S[i]=(S[i-1]+phi[i]*i*i)%p;
}
inline ll calc(ll x){
if(x<=Maxn-7) return S[x];
if(Phi[x]) return Phi[x];
ll res=x*(x+1)/2;
for(ll l=1,r;l<=x;l=r+1){
r=x/(x/l);
res-=(f2(r)-f2(l-1)+p)%p*calc(x/l)%p;
res=(res+p)%p;
}
res=(res+p)%p;
return Phi[x]=res;
}
int main(){
scanf("%lld%lld",&p,&n);
inv=ksm(6ll,p-2,p);
EulerSieve(Maxn-7);
for(ll l=1,r;l<=n;l=r+1){
r=n/(n/l);
ans=(ans+(calc(r)-calc(l-1)+p)%p*f3(n/l))%p;
}
printf("%lld",ans);
return 0;
}