题意
求
∑
i
=
1
n
g
c
d
(
⌊
i
3
⌋
,
i
)
\sum_{i=1}^ngcd(\lfloor\sqrt[3]i\rfloor,i)
i=1∑ngcd(⌊3i⌋,i)
T
≤
11
,
n
≤
1
0
21
T\le 11,n\le10^{21}
T≤11,n≤1021
分析
直接推式子
∑
i
=
1
n
g
c
d
(
⌊
i
3
⌋
,
i
)
\sum_{i=1}^ngcd(\lfloor\sqrt[3]i\rfloor,i)
i=1∑ngcd(⌊3i⌋,i)
=
∑
d
=
1
⌊
n
3
⌋
d
∑
i
=
1
n
[
g
c
d
(
⌊
i
3
⌋
,
i
)
=
d
]
=\sum_{d=1}^{\lfloor\sqrt[3]n\rfloor}d\sum_{i=1}^n[gcd(\lfloor\sqrt[3]i\rfloor,i)=d]
=d=1∑⌊3n⌋di=1∑n[gcd(⌊3i⌋,i)=d]
设
r
=
⌊
n
3
⌋
r=\lfloor\sqrt[3]n\rfloor
r=⌊3n⌋,反演一波可以得到
=
∑
i
=
(
⌊
n
3
⌋
)
3
n
g
c
d
(
⌊
n
3
⌋
,
i
)
+
∑
i
=
1
r
i
∑
i
∣
d
μ
(
d
i
)
∑
d
∣
k
(
⌊
(
k
+
1
)
3
−
1
d
⌋
−
⌊
k
3
−
1
d
⌋
)
=\sum_{i=(\lfloor\sqrt[3]n\rfloor)^3}^ngcd(\lfloor\sqrt[3]n\rfloor,i)+\sum_{i=1}^ri\sum_{i|d}\mu(\frac{d}{i})\sum_{d|k}(\lfloor\frac{(k+1)^3-1}{d}\rfloor-\lfloor\frac{k^3-1}{d}\rfloor)
=i=(⌊3n⌋)3∑ngcd(⌊3n⌋,i)+i=1∑rii∣d∑μ(id)d∣k∑(⌊d(k+1)3−1⌋−⌊dk3−1⌋)
如果设
n
′
=
⌊
n
3
⌋
,
m
=
n
−
n
′
3
n'=\lfloor\sqrt[3]n\rfloor,m=n-n'^3
n′=⌊3n⌋,m=n−n′3,那么第一部分就等于要求
∑
i
=
1
m
g
c
d
(
n
′
,
i
)
\sum_{i=1}^mgcd(n',i)
i=1∑mgcd(n′,i)
=
∑
d
∣
n
′
d
∑
i
=
1
m
[
g
c
d
(
n
′
,
i
)
=
d
]
=\sum_{d|n'}d\sum_{i=1}^m[gcd(n',i)=d]
=d∣n′∑di=1∑m[gcd(n′,i)=d]
=
∑
d
∣
n
′
⌊
m
d
⌋
φ
(
d
)
=\sum_{d|n'}\lfloor\frac{m}{d}\rfloor\varphi(d)
=d∣n′∑⌊dm⌋φ(d)
可以在
O
(
n
′
)
O(\sqrt{n'})
O(n′)的复杂度内求出。
第二部分等于
∑
d
=
1
r
φ
(
d
)
∑
d
∣
k
(
⌊
(
k
+
1
)
3
−
1
d
⌋
−
⌊
k
3
−
1
d
⌋
)
\sum_{d=1}^r\varphi(d)\sum_{d|k}(\lfloor\frac{(k+1)^3-1}{d}\rfloor-\lfloor\frac{k^3-1}{d}\rfloor)
d=1∑rφ(d)d∣k∑(⌊d(k+1)3−1⌋−⌊dk3−1⌋)
=
∑
d
=
1
r
φ
(
d
)
∑
b
=
1
⌊
r
d
⌋
⌊
(
b
d
+
1
)
3
−
1
d
⌋
−
⌊
(
b
d
)
3
−
1
d
⌋
=\sum_{d=1}^r\varphi(d)\sum_{b=1}^{\lfloor\frac{r}{d}\rfloor}\lfloor\frac{(bd+1)^3-1}{d}\rfloor-\lfloor\frac{(bd)^3-1}{d}\rfloor
=d=1∑rφ(d)b=1∑⌊dr⌋⌊d(bd+1)3−1⌋−⌊d(bd)3−1⌋
=
∑
d
=
1
r
φ
(
d
)
∑
b
=
1
⌊
r
d
⌋
(
3
b
2
d
+
3
b
+
1
)
=\sum_{d=1}^r\varphi(d)\sum_{b=1}^{\lfloor\frac{r}{d}\rfloor}(3b^2d+3b+1)
=d=1∑rφ(d)b=1∑⌊dr⌋(3b2d+3b+1)
感觉第二部分也可以通过预处理+整除分块做到
O
(
r
)
O(\sqrt r)
O(r),但既然
O
(
r
)
O(r)
O(r)就能过,那就没必要这么搞了。
代码
#include<bits/stdc++.h>
typedef long long LL;
typedef __int128 IT;
//typedef long long IT;
const int ny6=166374059;
const int MOD=998244353;
const int N=10000005;
const int maxn=10000000;
int phi[N],tot,prime[N/10];
bool not_prime[N];
IT n;
template <class T>
void read(T &x)
{
static char ch;
static bool neg;
for(ch=neg=0; ch<'0' || '9'<ch; neg|=ch=='-',ch=getchar());
for(x=0; '0'<=ch && ch<='9'; (x*=10)+=ch-'0',ch=getchar());
x=neg?-x:x;
}
int add(int x,int y) {return x+y<MOD?x+y:x+y-MOD;}
IT read()
{
IT x=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while (ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
void get_prime(int n)
{
phi[1]=1;
for (int i=2;i<=n;i++)
{
if (!not_prime[i]) prime[++tot]=i,phi[i]=i-1;
for (int j=1;j<=tot&&i*prime[j]<=n;j++)
{
not_prime[i*prime[j]]=1;
if (i%prime[j]==0)
{
phi[i*prime[j]]=phi[i]*prime[j];
break;
}
phi[i*prime[j]]=phi[i]*(prime[j]-1);
}
}
}
int sqrt3(IT n)
{
int l=1,r=maxn;
while (l<=r)
{
int mid=(l+r)/2;
if ((IT)mid*mid*mid<=n) l=mid+1;
else r=mid-1;
}
return l-1;
}
int solve1(int n,LL m)
{
int ans=n;
for (int i=1;i*i<=n;i++)
if (n%i==0)
{
ans=add(ans,(LL)(m/i)%MOD*phi[i]%MOD);
if (n/i!=i) ans=add(ans,(LL)(m/(n/i))%MOD*phi[n/i]%MOD);
}
return ans;
}
int get1(int n)
{
return (LL)n*(n+1)/2%MOD;
}
int get2(int n)
{
return (LL)n*(n+1)%MOD*(n*2+1)%MOD*ny6%MOD;
}
int solve2(int n)
{
int ans=0;
for (int i=1;i<=n;i++) ans=add(ans,(LL)phi[i]*((LL)3*i*get2(n/i)%MOD+(LL)3*get1(n/i)%MOD+(LL)n/i)%MOD);
return ans;
}
int main()
{
get_prime(maxn);
int T;scanf("%d",&T);
while (T--)
{
read(n);
int r=sqrt3(n),ans=add(solve1(r,(LL)(n-(IT)r*r*r)),solve2(r-1));
printf("%d\n",ans);
}
return 0;
}