题面描述
已知定值
c
c
c,给出
a
,
b
a,b
a,b 的值,求
∑
i
=
1
a
∑
j
=
1
b
∑
k
=
0
c
∑
d
=
1
i
d
k
[
i
l
c
m
(
d
,
j
)
]
\sum_{i=1}^a \sum_{j=1}^b \sum_{k=0}^c \sum_{d=1}^i d^k [\frac{i}{lcm(d,j)}]
∑i=1a∑j=1b∑k=0c∑d=1idk[lcm(d,j)i] 模
998244353
998244353
998244353的值。共
t
t
t 次询问。
1
⩽
t
⩽
200000
,
1
⩽
a
⩽
1
0
6
,
1
⩽
b
⩽
1
0
18
,
0
⩽
c
⩽
1
0
18
1 \leqslant t \leqslant 200000,1 \leqslant a \leqslant 10^6,1 \leqslant b \leqslant 10^{18},0 \leqslant c \leqslant 10^{18}
1⩽t⩽200000,1⩽a⩽106,1⩽b⩽1018,0⩽c⩽1018
时间限制3s,空间限制512MB。
题解
不难看出原式中的等比数列求和,将原式变为:
∑
i
=
1
a
∑
j
=
1
b
∑
d
=
1
i
[
i
l
c
m
(
d
,
j
)
]
g
(
d
)
\sum_{i=1}^a \sum_{j=1}^b \sum_{d=1}^i [\frac{i}{lcm(d,j)}] g(d)
∑i=1a∑j=1b∑d=1i[lcm(d,j)i]g(d)
其中
g
(
n
)
=
∑
i
=
0
c
n
i
g(n)=\sum_{i=0}^c n^i
g(n)=∑i=0cni,即:
g
(
n
)
=
{
c
+
1
(
d
=
1
)
d
c
+
1
−
1
d
−
1
(
d
>
1
)
g(n)=\begin{cases} c+1(d=1) \\ \frac{d^{c+1}-1}{d-1}(d > 1) \end{cases}
g(n)={c+1(d=1)d−1dc+1−1(d>1)
考虑到
[
i
l
c
m
(
d
,
j
)
]
[\frac{i}{lcm(d,j)}]
[lcm(d,j)i] 即为不超过
i
i
i 且同时为
d
,
j
d,j
d,j 倍数的数的个数,枚举
d
,
j
d,j
d,j 的公倍数,得到:
∑
i
=
1
a
∑
j
=
1
b
∑
d
=
1
i
g
(
d
)
∑
k
=
1
i
[
j
∣
k
]
[
d
∣
k
]
\sum_{i=1}^a \sum_{j=1}^b \sum_{d=1}^i g(d) \sum_{k=1}^i [j|k][d|k]
∑i=1a∑j=1b∑d=1ig(d)∑k=1i[j∣k][d∣k]
交换求和符号顺序:
∑
i
=
1
a
∑
k
=
1
i
∑
j
∣
k
b
∑
d
∣
k
i
g
(
d
)
\sum_{i=1}^a \sum_{k=1}^i \sum_{j|k}^b \sum_{d|k}^i g(d)
∑i=1a∑k=1i∑j∣kb∑d∣kig(d)
设
f
(
n
)
=
∑
d
∣
n
g
(
d
)
f(n) = \sum_{d|n} g(d)
f(n)=∑d∣ng(d),则有:
∑
i
=
1
a
∑
k
=
1
i
∑
j
∣
k
b
f
(
i
)
\sum_{i=1}^a \sum_{k=1}^i \sum_{j|k}^b f(i)
∑i=1a∑k=1i∑j∣kbf(i)
考虑每个
f
(
i
)
f(i)
f(i) 被计算的次数,得到等价的式子:
∑
i
=
1
a
∑
j
∣
i
b
f
(
i
)
(
a
−
i
+
1
)
\sum_{i=1}^a \sum_{j|i}^b f(i)(a-i+1)
∑i=1a∑j∣ibf(i)(a−i+1)
设
b
2
=
min
(
a
,
b
)
b_2=\min(a,b)
b2=min(a,b),得到最终的式子:
(
a
+
1
)
∑
i
=
1
a
∑
j
∣
i
b
2
f
(
i
)
−
∑
i
=
1
a
∑
j
∣
i
b
2
f
(
i
)
i
(a+1) \sum_{i=1}^a \sum^{b_2}_{j|i} f(i) - \sum_{i=1}^a \sum_{j|i}^{b_2} f(i)i
(a+1)∑i=1a∑j∣ib2f(i)−∑i=1a∑j∣ib2f(i)i
对询问的
b
2
b_2
b2 排序,用分块维护式子的值即可。预处理
f
f
f 函数的值。
时间复杂度
O
(
a
ln
a
+
t
a
)
O(a \ln a + t \sqrt{a})
O(alna+ta),空间复杂度
O
(
a
)
O(a)
O(a)
#include<stdio.h>
#include<algorithm>
#define R register int
#define L long long
#define I inline
#define N 1000001
#define P 998244353
int ans[200000],g[N],inv[N],f[N],c1[1000488],c2[1000488],sum1[977],sum2[977],prime[78498];
I void Add(int&x,int y){
x+=y;
if(x>=P){
x-=P;
}
}
I int PowMod(int x,int y){
int res=1;
while(y!=0){
if((y&1)==1){
res=(L)res*x%P;
}
y>>=1;
x=(L)x*x%P;
}
return res;
}
struct Query{
int A,B,Id;
I friend bool operator<(Query x,Query y){
return x.B<y.B;
}
}q[200000];
I void Modify(const int x){
const int d1=f[x],d2=(L)x*f[x]%P;
Add(c1[x],d1);
Add(sum1[x>>10],d1);
Add(c2[x],d2);
Add(sum2[x>>10],d2);
}
I int GetAns(int x){
int res1=0,res2=0,b=x>>10;
for(R i=0;i!=b;i++){
Add(res1,sum1[i]);
Add(res2,sum2[i]);
}
for(R i=b<<10;i<=x;i++){
Add(res1,c1[i]);
Add(res2,c2[i]);
}
return((1ll+x)*res1-res2+P)%P;
}
int main(){
inv[1]=1;
int t,a=0;
scanf("%d",&t);
L c;
scanf("%lld",&c);
c++;
g[1]=c%P;
c%=P-1;
for(R i=2;i!=N;i++){
inv[i]=(L)(P-P/i)*inv[P%i]%P;
if(f[i]==0){
prime[a]=i;
g[i]=PowMod(i,c);
a++;
}
for(R j=0;prime[j]*i<N;j++){
int t=i*prime[j];
f[t]=-1;
g[t]=(L)g[i]*g[prime[j]]%P;
if(i%prime[j]==0){
break;
}
}
}
for(R i=2;i!=N;i++){
g[i]=(g[i]-1ll)*inv[i-1]%P;
}
for(R i=1;i!=N;i++){
for(R j=i;j<N;j+=i){
if(f[j]==-1){
f[j]=0;
}
Add(f[j],g[i]);
}
}
for(R i=0;i!=t;i++){
q[i].Id=i;
scanf("%d",&q[i].A);
L b;
scanf("%lld",&b);
q[i].B=q[i].A>b?b:q[i].A;
}
std::sort(q,q+t);
a=1;
for(R i=0;i!=t;i++){
while(a<=q[i].B){
for(R j=a;j<N;j+=a){
Modify(j);
}
a++;
}
ans[q[i].Id]=GetAns(q[i].A);
}
for(R i=0;i!=t;i++){
printf("%d\n",ans[i]);
}
return 0;
}
此题限于式子结构不可莫比乌斯反演。