2016广东省省赛H题

题意:计算:

i=1nj=1mi2j2gcd(i,j)
(时限1000ms)

input:

T(t<=1000),接下来t行,m,n(n,m<1e6).


题目难点在于多了i,j的平方,由对称性,设n < m,可以这样化简:

=====d=kd===i=1nj=1mi2j2gcd(i,j)i=1nj=1md|i,d|ji2j2d[(id,jd)=1]d=1ni=1ndj=1mdi2j2d5[(i,j)=1]d=1ni=1ndj=1mdi2j2d5d|i,d|jμ(d)d=1nd=1ndi=1nddj=1mddi2j2d4d5μ(d)k=1nd|ki=1nkj=1mki2j2k4dμ(kd)k=1ni=1nkj=1mki2j2k4(μId)k=1ni=1nkj=1mki2j2k4ϕ(k)k=1nk4ϕ(k)(i=1nki2)(j=1mkj2)(1)(2)(3)

推导到这里就可以解决了。

k4ϕ(k) 这部分可以打表求前缀和, nki=1i2mkj=1j2 这部分打表或者用平方和公式。对于固定的 n,nk 共有 O(n) 个取值,所以总复杂度是 O(n+m)


(2)式中符号*代表卷积, Id 函数代表 Id(n)=n ;他们的卷积是 ϕ(n) ,下面给出证明:
由于 μ,Id 都是积性函数,所以他们卷积也是积性函数.
n=si=1pkii 那么:

d|ndμ(nd)=i=1s(j=0kipjiμ(pkiipji))=i=1s(pkiipki1i)=ϕ(n)

对比(1),(3)式子,感觉很相似,可是在推导过程从莫比乌斯反演然后卷积才得出欧拉函数,感觉是绕了一下,不知有没有更好的推导方法。

后来发现原来第一步可以这样化简:

=i=1nj=1mi2j2gcd(i,j)i=1nj=1mi2j2k|gcd(i,j)ϕ(k)

接着就有后面了。。。捂脸

这里简单补一个证明:
k|nϕ(k)=n
ϕ(n) 是积性函数,同样设 n=si=1pkii
那么有:
k|nϕ(k)=si=1kij=0ϕ(pji)=si=1(1+kij=1(pjipj1i))=si=1pkii=n
所以其实对于gcd的某些问题,用欧拉函数处理要比反演要优。mark。
相关代码:

const int maxn = 1000006;
int prime[maxn];
int phi[maxn];
void getP();//欧拉函数打表,之后要和i^4相乘再求前缀和
int sum2[maxn];//∑i^2

int main()
{
    //...
    int ans=0;
    if(n>m) swap(n,m);
    for(int i=1,j;i<=n;i=j+1)
    {
        j=min(m/(m/i),n/(n/i));
        ans+=(phi[j]-phi[i-1])*sum2[m/i]*sum2[n/i];//这里还没考虑溢出
        ans%=mod;
    }
    //...
}

你可能感兴趣的:(数学数论)