|
|
|
|
@ -63,15 +63,17 @@ inline ll fpow(ll a, ll b, ll m)
|
|
|
|
|
}
|
|
|
|
|
constexpr double eps = 1e-8;
|
|
|
|
|
inline int sgn(double x) { return x > eps ? 1 : x < -eps ? -1 : 0; }
|
|
|
|
|
namespace Min25
|
|
|
|
|
{
|
|
|
|
|
const int N = 1000010;
|
|
|
|
|
int prime[N], id1[N], id2[N], flag[N], ncnt, m;
|
|
|
|
|
ll g[N], sum[N], a[N], T, n;
|
|
|
|
|
inline int ID(ll x) { return x <= T ? id1[x] : id2[n / x]; }
|
|
|
|
|
inline ll calc(ll x) { return x * (x + 1) / 2 - 1; }
|
|
|
|
|
inline ll f(ll x) { return x; }
|
|
|
|
|
void init()
|
|
|
|
|
void initPrime()
|
|
|
|
|
{
|
|
|
|
|
T = sqrt(n + 0.5);
|
|
|
|
|
T = 1e5 + 50;
|
|
|
|
|
for (int i = 2; i <= T; i++)
|
|
|
|
|
{
|
|
|
|
|
if (!flag[i]) prime[++ncnt] = i, sum[ncnt] = sum[ncnt - 1] + i;
|
|
|
|
|
@ -81,6 +83,11 @@ void init()
|
|
|
|
|
if (i % prime[j] == 0) break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
void init()
|
|
|
|
|
{
|
|
|
|
|
m = 0;
|
|
|
|
|
T = sqrt(n + 0.5);
|
|
|
|
|
for (ll l = 1; l <= n; l = n / (n / l) + 1)
|
|
|
|
|
{
|
|
|
|
|
a[++m] = n / l;
|
|
|
|
|
@ -91,10 +98,14 @@ void init()
|
|
|
|
|
g[m] = calc(a[m]);
|
|
|
|
|
}
|
|
|
|
|
for (int i = 1; i <= ncnt; i++)
|
|
|
|
|
for (int j = 1; j <= m && (ll)prime[i] * prime[i] <= a[j]; j++)
|
|
|
|
|
g[j] = g[j] - (ll)prime[i] * (g[ID(a[j] / prime[i])] - sum[i - 1]);
|
|
|
|
|
for (int j = 1; j <= m && (ll)prime[i] * prime[i] <= a[j]; j++) g[j] = g[j] - (ll)prime[i] * (g[ID(a[j] / prime[i])] - sum[i - 1]);
|
|
|
|
|
}
|
|
|
|
|
inline ll solve(ll x)
|
|
|
|
|
{
|
|
|
|
|
if (x <= 1) return x;
|
|
|
|
|
return n = x, init(), g[ID(n)];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
} // namespace Min25
|
|
|
|
|
ll calc1(ll _n, ll mod)
|
|
|
|
|
{
|
|
|
|
|
__int128 x = _n;
|
|
|
|
|
@ -102,8 +113,7 @@ ll calc1(ll _n, ll mod)
|
|
|
|
|
}
|
|
|
|
|
int main()
|
|
|
|
|
{
|
|
|
|
|
n = 1e10 + 10;
|
|
|
|
|
init();
|
|
|
|
|
Min25::initPrime();
|
|
|
|
|
int T;
|
|
|
|
|
ll __N, mod;
|
|
|
|
|
read(T);
|
|
|
|
|
@ -111,7 +121,7 @@ int main()
|
|
|
|
|
{
|
|
|
|
|
read(__N, mod);
|
|
|
|
|
ll ans = calc1(__N, mod);
|
|
|
|
|
ans = ans + g[ID(__N + 1)];
|
|
|
|
|
ans = ans + Min25::solve(__N + 1) % mod;
|
|
|
|
|
printf("%lld\n", ans % mod);
|
|
|
|
|
}
|
|
|
|
|
return 0;
|
|
|
|
|
|