题目链接:https://nanti.jisuanke.com/t/31444
考虑杜教筛就跑偏了…
定义
gay(i)=i2∗μ2(i)
g
a
y
(
i
)
=
i
2
∗
μ
2
(
i
)
∑ni=1∑ij=1gay(i)=∑ni=1(n−i+1)gay(i)=∑ni=1(n−i+1)i2μ2(i)
∑
i
=
1
n
∑
j
=
1
i
g
a
y
(
i
)
=
∑
i
=
1
n
(
n
−
i
+
1
)
g
a
y
(
i
)
=
∑
i
=
1
n
(
n
−
i
+
1
)
i
2
μ
2
(
i
)
有
μ2(n)=∑i2|nμ(i)
μ
2
(
n
)
=
∑
i
2
|
n
μ
(
i
)
因此上式
=∑ni=1(n−i+1)i2(∑j2|iμ(j))
=
∑
i
=
1
n
(
n
−
i
+
1
)
i
2
(
∑
j
2
|
i
μ
(
j
)
)
枚举因子变成枚举倍数
∑ni=1(n−i+1)i2(∑j2|iμ(j))=∑n√i=1μ(i)(∑⌊ni2⌋j=1(n−i2j+1)i4j2)=∑n√i=1μ(i)(∑⌊ni2⌋j=1(i4j2(n+1)−i6j3))
∑
i
=
1
n
(
n
−
i
+
1
)
i
2
(
∑
j
2
|
i
μ
(
j
)
)
=
∑
i
=
1
n
μ
(
i
)
(
∑
j
=
1
⌊
n
i
2
⌋
(
n
−
i
2
j
+
1
)
i
4
j
2
)
=
∑
i
=
1
n
μ
(
i
)
(
∑
j
=
1
⌊
n
i
2
⌋
(
i
4
j
2
(
n
+
1
)
−
i
6
j
3
)
)
∑ni=1i2=n∗(n+1)∗(2n+1)6,∑ni=1i3=n2(n+1)24
∑
i
=
1
n
i
2
=
n
∗
(
n
+
1
)
∗
(
2
n
+
1
)
6
,
∑
i
=
1
n
i
3
=
n
2
(
n
+
1
)
2
4
直接开写吧,注意过程爆LL。
∑n√i=1μ(i)(∑⌊ni2⌋j=1(i4j2(n+1)−i6j3))
∑
i
=
1
n
μ
(
i
)
(
∑
j
=
1
⌊
n
i
2
⌋
(
i
4
j
2
(
n
+
1
)
−
i
6
j
3
)
)
=∑n√i=1μ(i)(∑⌊ni2⌋j=1(i4j2(n+1)−∑⌊ni2⌋j=1i6j3))
=
∑
i
=
1
n
μ
(
i
)
(
∑
j
=
1
⌊
n
i
2
⌋
(
i
4
j
2
(
n
+
1
)
−
∑
j
=
1
⌊
n
i
2
⌋
i
6
j
3
)
)
#define others
#ifdef poj
#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <string>
#include <map>
#include <set>
#endif // poj
#ifdef others
#include <bits/stdc++.h>
#include <ext/rope>
#include <ext/pb_ds/priority_queue.hpp>
#endif // others
//#define file
#define all(x) x.begin(), x.end()
using namespace std;
using namespace __gnu_pbds;
using namespace __gnu_cxx;
#define eps 1e-8
const double pi = acos(-1.0);
typedef long long LL;
typedef __int128 DLL;
typedef unsigned long long ULL;
void umax(LL &a, LL b) {
a = max(a, b);
}
void umin(LL &a, LL b) {
a = min(a, b);
}
int dcmp(double x) {
return fabs(x) <= eps?0:(x > 0?1:-1);
}
void file() {
freopen("data_in.txt", "r", stdin);
freopen("data_out.txt", "w", stdout);
}
DLL mod = 1e9+7;
DLL Pow(DLL a,DLL b) {
DLL res=1;
a%=mod;
for(; b; b>>=1) {
if(b&1)res=res*a%mod;
a=a*a%mod;
}
return res;
}
//
//void print(DLL x) {
// if(x < 0) {
// x = -x;
// putchar('-');
// }
// if(x > 9) print(x/10);
// putchar(x%10 + '0');
//}
//#define iostart
#define pb(x) push_back(x)
namespace solver {
const int maxn = 1100000;
int cnt;
int p[maxn/10];
int mob[maxn];
bool tag[maxn];
void shai() {
cnt = 0;
mob[1] = 1;
for (int i = 2; i < maxn; i++) {
if (!tag[i]) {
mob[i] = -1;
p[cnt++] = i;
}
for (int j = 0; j < cnt && i * p[j] < maxn; j++){
tag[i*p[j]] = 1;
if (i % p[j] == 0){
mob[i*p[j]] = 0;
break;
}
mob[i*p[j]] = -mob[i];
}
}
}
DLL get2(DLL n) {
return (n*(n+1)*(2*n+1)/6)%mod;
}
DLL get3(DLL n) {
DLL v = n * (n + 1) / 2;
v %= mod;
return v*v%mod;
}
void solve() {
shai();
LL n, p;
while (~scanf("%lld%lld", &n, &p)) {
mod = p;
LL res = 0;
for (DLL i = 1; i <= sqrt(n); i++){
DLL i4 = Pow(i, 4);
DLL i6 = Pow(i, 6);
DLL v = n/(i*i);
DLL temp = i4*(n+1)%mod*get2(v)%mod;
temp -= i6*get3(v)%mod;
temp %= mod;
temp += mod;
temp %= mod;
res += (DLL)mob[i] * temp % mod;
res %= mod;
res += mod;
res %= mod;
}
cout << res << '\n';
}
};
}
int main() {
#ifdef iostart
ios::sync_with_stdio(0);
cin.tie(0);
#endif // iostart
// file();
solver::solve();
return 0;
}