题意:
给定正整数
T
,
k
,
x
T,k,x
T,k,x,接下来
T
T
T组样例,每组样例给出一个正整数
n
n
n,对于每个
n
n
n,要求出
∑
a
1
=
1
n
∑
a
2
=
1
n
…
∑
a
x
=
1
n
(
∏
j
=
1
x
a
j
k
)
f
(
g
c
d
(
a
1
,
a
2
,
…
,
a
x
)
)
g
c
d
(
a
1
,
a
2
,
…
,
a
x
)
\sum_{a_{1}=1}^{n}\sum_{a_{2}=1}^{n}…\sum_{a_{x}=1}^{n}(\prod_{j=1}^{x}a_{j}^{k})f(gcd(a_{1},a_{2},…,a_{x}))gcd(a_{1},a_{2},…,a_{x})
a1=1∑na2=1∑n…ax=1∑n(j=1∏xajk)f(gcd(a1,a2,…,ax))gcd(a1,a2,…,ax)
其中
f
(
x
)
f(x)
f(x)的定义是,当
x
x
x存在平方因子时,
f
(
x
)
=
0
f(x)=0
f(x)=0,否则
f
(
x
)
=
1
f(x)=1
f(x)=1。
(
1
≤
T
≤
1
0
4
,
1
≤
k
,
x
≤
1
0
9
,
1
≤
n
≤
2
×
1
0
5
)
(1\leq T \leq 10^{4},1\leq k,x \leq 10^{9},1\leq n \leq 2\times 10^{5})
(1≤T≤104,1≤k,x≤109,1≤n≤2×105)
推导:
套路提出
g
c
d
gcd
gcd,变成
∑
g
=
1
n
∑
a
1
=
1
n
∑
a
2
=
1
n
…
∑
a
x
=
1
n
(
∏
j
=
1
x
a
j
k
)
f
(
g
)
g
[
g
=
g
c
d
(
a
1
,
a
2
,
…
,
a
x
)
]
\sum_{g=1}^{n}\sum_{a_{1}=1}^{n}\sum_{a_{2}=1}^{n}…\sum_{a_{x}=1}^{n}(\prod_{j=1}^{x}a_{j}^{k})f(g)g[g=gcd(a_{1},a_{2},…,a_{x})]
g=1∑na1=1∑na2=1∑n…ax=1∑n(j=1∏xajk)f(g)g[g=gcd(a1,a2,…,ax)]
然后调整一下式子,
∑
g
=
1
n
g
[
g
不
存
在
平
方
因
子
]
∑
a
1
=
1
n
∑
a
2
=
1
n
…
∑
a
x
=
1
n
(
∏
j
=
1
x
a
j
k
)
[
g
=
g
c
d
(
a
1
,
a
2
,
…
,
a
x
)
]
\sum_{g=1}^{n}g[g不存在平方因子]\sum_{a_{1}=1}^{n}\sum_{a_{2}=1}^{n}…\sum_{a_{x}=1}^{n}(\prod_{j=1}^{x}a_{j}^{k})[g=gcd(a_{1},a_{2},…,a_{x})]
g=1∑ng[g不存在平方因子]a1=1∑na2=1∑n…ax=1∑n(j=1∏xajk)[g=gcd(a1,a2,…,ax)]
我们令
f
(
g
)
f(g)
f(g),
f
(
g
)
=
∑
a
1
=
1
n
∑
a
2
=
1
n
…
∑
a
x
=
1
n
(
∏
j
=
1
x
a
j
k
)
[
g
=
g
c
d
(
a
1
,
a
2
,
…
,
a
x
)
]
f(g)=\sum_{a_{1}=1}^{n}\sum_{a_{2}=1}^{n}…\sum_{a_{x}=1}^{n}(\prod_{j=1}^{x}a_{j}^{k})[g=gcd(a_{1},a_{2},…,a_{x})]
f(g)=a1=1∑na2=1∑n…ax=1∑n(j=1∏xajk)[g=gcd(a1,a2,…,ax)]
然后
F
(
g
)
=
∑
g
∣
d
f
(
d
)
F(g)=\sum_{g|d}f(d)
F(g)=∑g∣df(d),
F
(
g
)
=
∑
g
∣
d
f
(
d
)
=
∑
a
1
=
1
n
∑
a
2
=
1
n
…
∑
a
x
=
1
n
(
∏
j
=
1
x
a
j
k
)
[
g
∣
g
c
d
(
a
1
,
a
2
,
…
,
a
x
)
]
=
∑
g
∣
a
1
∑
g
∣
a
2
…
∑
g
∣
a
x
(
∏
j
=
1
x
a
j
k
)
=
∑
a
1
=
1
⌊
n
g
⌋
∑
a
2
=
1
⌊
n
g
⌋
…
∑
a
x
=
1
⌊
n
g
⌋
(
∏
j
=
1
x
a
j
k
g
k
)
=
∑
a
1
=
1
⌊
n
g
⌋
a
1
k
g
k
∑
a
2
=
1
⌊
n
g
⌋
a
2
k
g
k
…
∑
a
x
=
1
⌊
n
g
⌋
a
x
k
g
k
=
g
x
k
(
∑
a
=
1
⌊
n
g
⌋
a
k
)
x
F(g)=\sum_{g|d}f(d)=\sum_{a_{1}=1}^{n}\sum_{a_{2}=1}^{n}…\sum_{a_{x}=1}^{n}(\prod_{j=1}^{x}a_{j}^{k})[g|gcd(a_{1},a_{2},…,a_{x})]\\ =\sum_{g|a_{1}}\sum_{g|a_{2}}…\sum_{g|a_{x}}(\prod_{j=1}^{x}a_{j}^{k})\\ =\sum_{a_{1}=1}^{\lfloor \frac{n}{g} \rfloor}\sum_{a_{2}=1}^{\lfloor \frac{n}{g} \rfloor}…\sum_{a_{x}=1}^{\lfloor \frac{n}{g} \rfloor}(\prod_{j=1}^{x}a_{j}^{k}g^{k})\\ =\sum_{a_{1}=1}^{\lfloor \frac{n}{g} \rfloor}a_{1}^{k}g^{k}\sum_{a_{2}=1}^{\lfloor \frac{n}{g} \rfloor}a_{2}^{k}g^{k}…\sum_{a_{x}=1}^{\lfloor \frac{n}{g} \rfloor}a_{x}^{k}g^{k}\\ =g^{xk}(\sum_{a=1}^{\lfloor \frac{n}{g} \rfloor}a^{k})^{x}
F(g)=g∣d∑f(d)=a1=1∑na2=1∑n…ax=1∑n(j=1∏xajk)[g∣gcd(a1,a2,…,ax)]=g∣a1∑g∣a2∑…g∣ax∑(j=1∏xajk)=a1=1∑⌊gn⌋a2=1∑⌊gn⌋…ax=1∑⌊gn⌋(j=1∏xajkgk)=a1=1∑⌊gn⌋a1kgka2=1∑⌊gn⌋a2kgk…ax=1∑⌊gn⌋axkgk=gxk(a=1∑⌊gn⌋ak)x
把
F
(
g
)
F(g)
F(g)式子化简出来后,还是比较简单的,先留着备用。
然后对着原来的式子套反演,
∑
g
=
1
n
g
[
g
没
有
平
方
因
子
]
f
(
g
)
=
∑
g
=
1
n
[
g
没
有
平
方
因
子
]
∑
g
∣
d
μ
(
d
g
)
F
(
d
)
=
∑
g
=
1
n
g
[
g
没
有
平
方
因
子
]
∑
g
∣
d
μ
(
d
g
)
d
x
k
(
∑
a
=
1
⌊
n
d
⌋
a
k
)
x
\sum_{g=1}^{n}g[g没有平方因子]f(g)=\sum_{g=1}^{n}[g没有平方因子]\sum_{g|d}\mu(\frac{d}{g}) F(d) \\ =\sum_{g=1}^{n}g[g没有平方因子]\sum_{g|d}\mu(\frac{d}{g})d^{xk}(\sum_{a=1}^{\lfloor \frac{n}{d} \rfloor}a^{k})^{x}
g=1∑ng[g没有平方因子]f(g)=g=1∑n[g没有平方因子]g∣d∑μ(gd)F(d)=g=1∑ng[g没有平方因子]g∣d∑μ(gd)dxk(a=1∑⌊dn⌋ak)x
现在已经可以预处理
(
∑
a
=
1
⌊
n
d
⌋
a
k
)
x
(\sum_{a=1}^{\lfloor \frac{n}{d} \rfloor}a^{k})^{x}
(∑a=1⌊dn⌋ak)x然后
o
(
n
l
o
g
n
)
o(nlogn)
o(nlogn)做了,但是这样复杂度不够,我们考虑数论分块。
我们用一些函数把里面的一些东西代掉,让它看起来更优雅一些。
我们用 i s ( t ) is(t) is(t)表示 t t t有没有平方因子,有的时候为 0 0 0,否则为 1 1 1。
再用 A ( t ) = ( ∑ a = 1 t a k ) x A(t)=(\sum_{a=1}^{t}a^{k})^{x} A(t)=(∑a=1tak)x
原式变成,
∑
g
=
1
n
i
s
(
g
)
g
∑
g
∣
d
μ
(
d
g
)
d
x
k
A
(
⌊
n
d
⌋
)
\sum_{g=1}^{n}is(g)g\sum_{g|d}\mu(\frac{d}{g})d^{xk}A(\lfloor \frac{n}{d} \rfloor)
g=1∑nis(g)gg∣d∑μ(gd)dxkA(⌊dn⌋)
现在的式子还是不能数论分块。注意,我们现在是枚举
g
g
g,再用
d
d
d枚举
g
g
g的倍数。我们转化成枚举
d
d
d,再枚举
d
d
d的因子
g
g
g的形式,就变成,
∑
d
=
1
n
d
x
k
A
(
⌊
n
d
⌋
)
∑
g
∣
d
μ
(
d
g
)
i
s
(
g
)
g
\sum_{d=1}^{n}d^{xk}A(\lfloor \frac{n}{d} \rfloor)\sum_{g|d}\mu(\frac{d}{g})is(g)g
d=1∑ndxkA(⌊dn⌋)g∣d∑μ(gd)is(g)g
然后令
B
(
d
)
=
d
x
k
∑
g
∣
d
μ
(
d
g
)
i
s
(
g
)
g
B(d)=d^{xk}\sum_{g|d}\mu(\frac{d}{g})is(g)g
B(d)=dxk∑g∣dμ(gd)is(g)g,也是可以
o
(
n
l
o
g
n
)
o(nlogn)
o(nlogn)预处理的,式子最后变成,
∑
d
=
1
n
A
(
⌊
n
d
⌋
)
B
(
d
)
\sum_{d=1}^{n}A(\lfloor \frac{n}{d} \rfloor)B(d)
d=1∑nA(⌊dn⌋)B(d)
啊!这不就是某种显然的数论分块吗。
所以我们最后只要预处理出
B
(
d
)
B(d)
B(d)的前缀和
S
B
(
d
)
SB(d)
SB(d),再预处理出
A
(
d
)
A(d)
A(d),然后数论分块一下就好了。
代码常数巨大。
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1000000007;
const ll MAXN=400005;
ll fpow(ll a,ll n)
{
ll sum=1,base=a%mod;
while(n!=0)
{
if(n%2)sum=sum*base%mod;
base=base*base%mod;
n/=2;
}
return sum;
}
ll inv(ll a)
{
return fpow(a,mod-2);
}
ll prime[MAXN+10],notPrime[MAXN+10],mu[MAXN+10],tot;
void initMu(ll n)
{
notPrime[1]=mu[1]=1;
for(ll i=2;i<=n;i++)
{
if(!notPrime[i])prime[tot++]=i,mu[i]=-1;
for(ll j=0;j<tot&&i*prime[j]<=n;j++)
{
notPrime[i*prime[j]]=1;
if(i%prime[j])mu[i*prime[j]]=-mu[i];
else {mu[i*prime[j]]=0;break;}
}
}
}
ll T,k,x,n;
ll A[400005];
ll is[400005];
ll B[400005];
ll SB[400005];
int main()
{
scanf("%lld%lld%lld",&T,&k,&x);
initMu(200000);
for(ll i=2;i*i<=200000;i++)
{
for(ll j=1;i*i*j<=200000;j++)is[i*i*j]=1;
}
for(ll g=1;g<=200000;g++)
{
for(ll d=g;d<=200000;d+=g)
{
B[d]=(B[d]+g*mu[d/g]*(1-is[g])%mod)%mod;
}
}
for(ll d=1;d<=200000;d++)B[d]=B[d]*fpow(d,x*k)%mod;
for(ll d=1;d<=200000;d++)SB[d]=(SB[d-1]+B[d])%mod;
for(ll d=1;d<=200000;d++)
{
A[d]=(A[d-1]+fpow(d,k))%mod;
}
for(ll d=1;d<=200000;d++)A[d]=fpow(A[d],x);
while(T--)
{
scanf("%lld",&n);
ll ans=0;
for(ll l=1,r;l<=n;l=r+1)
{
if(n/l)r=n/(n/l);
else r=n;
r=min(r,n);
ans=(ans+A[n/l]*(SB[r]-SB[l-1])%mod)%mod;
}
ans=ans%mod;
printf("%lld\n",(ans%mod+mod)%mod);
}
return 0;
}