给定正整数 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
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;
}