51nod 1742 开心的小Q(莫比乌斯函数)

来源:互联网 发布:代码优化 编辑:程序博客网 时间:2024/05/21 18:37

看了官方题解的最终结果
这里写图片描述
表示“通过容斥原理很容易可以得到F(n)。。。”那里没看懂。。不过这并不影响做题,毕竟公式都有了,套上就行了。看懂的路过的求讲一下。

#include <bits/stdc++.h>using namespace std;typedef long long LL;const int MAXN = 100000;bool check[MAXN+10];int prime[MAXN+10];int mu[MAXN+10];void Moblus(){    memset(check,false,sizeof(check));    mu[1] = 1;    int tot = 0;    for(int i = 2; i <= MAXN; i++)    {        if( !check[i] )        {            prime[tot++] = i;            mu[i] = -1;        }        for(int j = 0; j < tot; j++)        {            if(i * prime[j] > MAXN) break;            check[i * prime[j]] = true;            if( i % prime[j] == 0)            {                mu[i * prime[j]] = 0;                break;            }            else            {                mu[i * prime[j]] = -mu[i];            }        }    }}LL F(LL num){    int limit = sqrt(num);    LL ret = 0;    for(int i = 1; i <= limit; ++i)        ret += mu[i]*(num/(i*i));    return num-ret;}LL S(LL num){    int limit = sqrt(num);    LL res = 0;    LL r;    for(int i = 1; i <= num; i = r+1)    {        r = num/(num/i);        res += (r-i+1)*F(num/i);    }    return res;}int main(){    Moblus();    int a,b;    scanf("%d %d",&a,&b);    printf("%I64d\n",S(b)-S(a-1));    return 0;}
原创粉丝点击