码迷,mamicode.com
首页 > 其他好文 > 详细

2016广东省省赛H题

时间:2016-05-12 22:53:45      阅读:271      评论:0      收藏:0      [点我收藏+]

标签:

题意:计算:

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

input:

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


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

=====d′=kd===∑i=1n∑j=1mi2j2gcd(i,j)∑i=1n∑j=1m∑d|i,d|ji2j2d[(id,jd)=1]∑d=1n∑i=1?nd?∑j=1?md?i2j2d5[(i,j)=1]∑d=1n∑i=1?nd?∑j=1?md?i2j2d5∑d′|i,d′|jμ(d′)∑d=1n∑d′=1?nd?∑i=1?ndd′?∑j=1?mdd′?i2j2d′4d5μ(d′)∑k=1n∑d|k∑i=1?nk?∑j=1?mk?i2j2k4dμ(kd)∑k=1n∑i=1?nk?∑j=1?mk?i2j2k4(μ?Id)∑k=1n∑i=1?nk?∑j=1?mk?i2j2k4?(k)∑k=1nk4?(k)(∑i=1?nk?i2)(∑j=1?mk?j2)(1)(2)(3)

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

k4?(k)这部分可以打表求前缀和,∑?nk?i=1i2,∑?mk?j=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(pkii?pki?1i)=?(n)

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

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

=∑i=1n∑j=1mi2j2gcd(i,j)∑i=1n∑j=1mi2j2∑k|gcd(i,j)?(k)

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

这里简单补一个证明:
∑k|n?(k)=n
?(n)是积性函数,同样设n=∏si=1pkii
那么有:
∑k|n?(k)=∏si=1∑kij=0?(pji)=∏si=1(1+∑kij=1(pji?pj?1i))=∏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;
    }
    //...
}

2016广东省省赛H题

标签:

原文地址:http://blog.csdn.net/ocgcn2010/article/details/51347167

踩
(0)
赞
(0)
   
举报
评论 一句话评论(0)
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!