题解 P4449 【于神之怒加强版】

给定n,m,k,计算

i = 1 n j = 1 m g c d ( i , j ) k \sum_{i=1}^n \sum_{j=1}^m \mathrm{gcd}(i,j)^k

1000000007 1000000007 取模的结果

前置知识

式子还是正常的推

首先, I D k ( x ) = x k ID_k(x)=x^k

i = 1 n j = 1 m I D k ( g c d ( i , j ) ) \sum_{i=1}^{n} \sum_{j=1}^{m} ID_k(gcd(i,j))

d = 1 I D k ( d ) i = 1 n j = 1 m [ gcd ( i , j ) = d ] \sum_{d=1} ID_k(d)\sum_{i=1}^{n} \sum_{j=1}^{m} [\gcd(i,j) =d]

d = 1 I D k ( d ) i = 1 n d j = 1 m d [ gcd ( i , j ) = 1 ] \sum_{d=1} ID_k(d)\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{d}\rfloor} [\gcd(i,j) =1]

d = 1 I D k ( d ) i = 1 n d j = 1 m d D gcd ( i , j ) μ ( D ) \sum_{d=1} ID_k(d)\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{d}\rfloor} \sum_{D\mid \gcd(i,j)} \mu(D)

d = 1 I D k ( d ) D = 1 min ( n , m ) μ ( D ) i = 1 n d D j = 1 m d D 1 \sum_{d=1} ID_k(d)\sum_{D=1}^{\min(n,m)}\mu(D)\sum_{i=1}^{\lfloor\frac{n}{dD}\rfloor}\sum_{j=1}^{\lfloor\frac{m}{dD}\rfloor} 1

d = 1 I D k ( d ) D = 1 n d μ ( D ) n d D m d D \sum_{d=1} ID_k(d)\sum_{D=1}^{\lfloor \frac{n}{d}\rfloor}\mu(D)\lfloor \frac{n}{dD} \rfloor \lfloor \frac{m}{dD} \rfloor

T = d D T=dD
T = 1 n T m T d T I D k ( d ) μ ( T d ) \sum_{T=1}\lfloor \frac{n}{T} \rfloor \lfloor \frac{m}{T} \rfloor \sum_{d|T} ID_k(d) \mu(\frac{T}{d})
我们发现后面这个东西就是狄利克雷卷积

我们管它叫 f f 函数

也就是说

f = I D k μ f=ID_k*\mu

由于积性函数卷积性函数还是积性函数

对于 x p r i m e x\in prime f ( x ) = x k 1 f(x)=x^k-1

这样子就直接在线性筛的时候算一下就好了

代码:

void sieve(){
    f[1]=1;
    for(int i=2;i<MAXN;i++){
        if(!vis[i]){
            prime[++prime[0]]=i;
            f[i]=(pw(i,k)-1+Mod)%Mod;
        }
        for(int j=1;j<=prime[0]&&i*prime[j]<MAXN;j++){
            vis[i*prime[j]]=true;
            if(i%prime[j]==0){f[i*prime[j]]=f[i]*(f[prime[j]]+1)%Mod;break;}
            f[i*prime[j]]=f[i]*f[prime[j]]%Mod;
        }
    }
    for(int i=1;i<MAXN;i++)s[i]=(s[i-1]+f[i])%Mod;
}
原创文章 134 获赞 238 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_46230164/article/details/105939268
今日推荐