您的位置:首页 > 其它

【BZOJ2301】【HAOI2011】Problem b 莫比乌斯反演+分块+前缀和

2015-03-26 10:56 465 查看

链接:

#include <stdio.h>
int main()
{
    puts("转载请注明出处[vmurder]谢谢");
    puts("网址:blog.csdn.net/vmurder/article/details/44647001");
}


莫比乌斯反演公式

若Fn=∑d|nfdF_n =\sum_{d|n} f_d

则fn=∑d|nFnd∗μdf_n = \sum_{d|n} F_{\frac n d}*\mu_d

其中μ\mu是莫比乌斯函数,跟FF和ff无关。

莫比乌斯函数

当d=1d=1时:

μd=1\mu_d = 1

当dd可以被拆解成kk个质因数之积且这些质因数两两不同时:

μd=(−1)k\mu_d = (-1)^k

其它情况下:

μd=0\mu_d = 0

题解:

首先数论题嘛,想到(cha dao)用莫比乌斯反演。

然后很明了了。

我们设fi,jf_{i,j}为答案函数,也就是gcd==k的数对的个数。

那么FF就也出来了,根据莫比乌斯反演公式那个破形式,就是gcd是k的倍数的数对的对数。(当然其实很多时候都是发现FF很好求,并且导到ff的形式符合莫比乌斯函数,才会去用。但是有的时候不妨去看答案函数作为ff时FF是什么,然后看FF是否好求)

然后Fi,jF_{i,j}很好求,就是⌊ik⌋∗⌊jk⌋\lfloor \frac i k \rfloor * \lfloor \frac j k \rfloor。。之后反演回去可以线性得到fi,jf_{i,j}

但是这样期望很快,不过当k==1k==1时,回代将是O(n)O(n)的,因为好多组询问,所以无法承受。

这时我们发现回代时对于某些i,j{i,j},它的FF是相同的,而这个“相同”,剩下的不相同的数,是根号级别的。然后我们可以分块处理相同的部分,F∗μF*\mu就变成了一段段的F∗sumμF*sum\mu

代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 101000
#define inf 0x3f3f3f3f
using namespace std;
int mu
,prime
,cnt;
bool vis
;

int sum_of_mu
;
void shake()
{
    int i,j;
    sum_of_mu[1]=mu[1]=1;
    for(i=2;i<N;i++)
    {
        if(!vis[i])
        {
            mu[i]=-1;
            prime[++cnt]=i;
        }
        for(j=1;i*prime[j]<N&&j<=cnt;j++)
        {
            vis[i*prime[j]]=true;
            if(i%prime[j])mu[i*prime[j]]=-mu[i];
            else break;
        }
        sum_of_mu[i]=sum_of_mu[i-1]+mu[i];
    }
}
int k;
long long calc(int n,int m)
{
    n/=k,m/=k;
    long long ret=0;
    int i,j,lim=min(n,m);
    for(i=1;i<=lim;i=j+1)
    {
        j=min(n/(n/i),m/(m/i));
        ret+=(long long)(n/i)*(m/i)*(sum_of_mu[j]-sum_of_mu[i-1]);
    }
    return ret;
}
inline long long Calc(int a,int b,int c,int d)
{return calc(b,d)-calc(a-1,d)-calc(b,c-1)+calc(a-1,c-1);}
int main()
{
    shake();
    int a,b,c,d,g;
    for(scanf("%d",&g);g--;)
    {
        scanf("%d%d%d%d%d",&a,&b,&c,&d,&k);
        printf("%lld\n",Calc(a,b,c,d));
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: