题意
给出
n
n
n,设
f
(
x
)
f(x)
f(x)表示有多少个有序数对
(
a
,
b
)
(a,b)
(a,b)满足
a
b
∣
x
ab|x
ab∣x。
求
∑
i
=
1
n
f
(
i
)
\sum_{i=1}^nf(i)
∑i=1nf(i)。
n
≤
1
0
12
n\le10^{12}
n≤1012
分析
看完题目就开始推式子,不难得到答案就是
∑
i
=
1
n
⌊
n
i
⌋
σ
0
(
i
)
\sum_{i=1}^n\lfloor\frac{n}{i}\rfloor\sigma_0(i)
i=1∑n⌊in⌋σ0(i)
然后就可以大力分块。。。。然后你就凉了。
估计这就是为什么比赛的时候没什么A的原因吧。
实际上
f
(
x
)
f(x)
f(x)可以看成是有多少个有序数对
(
a
,
b
,
c
)
(a,b,c)
(a,b,c)满足
a
b
c
=
x
abc=x
abc=x,那答案就是问有多少个有序三元组
(
a
,
b
,
c
)
(a,b,c)
(a,b,c)满足
a
b
c
≤
n
abc\le n
abc≤n。
那么我们可以先枚举三元组里面最小的数,再枚举次小的数,然后直接算答案即可。
代码
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
typedef long long LL;
const int MOD=2333;
LL n;
int main()
{
scanf("%lld",&n);
LL ans=0;
for (LL a=1;a*a*a<=n;a++)
for (LL b=a;b*a*b<=n;b++)
{
LL x=b,y=n/a/b;
if (a==b) (ans+=1+(y-x)%MOD*3)%=MOD;
else (ans+=3+(y-x)%MOD*6)%=MOD;
}
printf("%lld\n",ans);
return 0;
}