莫比乌斯函数(P3455 题解)

题目链接

我们定义 n 的莫比乌斯函数为 μn

我们将 n 分解质因式后为 n=p1α1p2α2pkαkμn={0 当 αi>1 时1 当 k 为偶数时1 当 k 为奇数时

gcd(x,y)=d,就等价于 gcd(xd,yd)=1

即为找到 x,y 满足 xad,ybdgcd(x,y)=1

假如不考虑条件 2,我们令 a=ad,b=bd。则答案为 ab

想必大家都知道容斥原理把,即答案为

abS2S3S5+S6+S10+S15+S30

其中 Si 表示 min{a,b}i[1,min{a,b}] 中所有 i 的倍数的个数。

然后根据上面 μ 的定义可得答案为 ab+i=2min{a,b}aibiμi

然后我们可以从 aibi 入手,我们发现必定可以分成若干个极大段,使得段内值相等。

我们考虑对于一个分数 ab,找到一个最大的整数 x,满足 ab=ax

x=aab

如果满足以上条件即满足 ab=axab>ax+1

证明条件 1

x=aabaab=bxbabaxax=aaabaaab=abab=ax

证明条件 2

a=kb+r,其中 0r<x

ab=k>ax+1=aaab+1=aak+1k>aak+1k>aak+1k(ak+1)>a

在设 a=pk+q,其中 0q<k

k(ak+1)>ak(p+1)>pk+qkp+k>pk+qk>q

从上面 0q<k 可知,k>q

结论:将这些数分段段数必定是 O(n) 的。

然后我们就可以每次跳到 aibi 的末尾,再求出 μ 的前缀和,然后根据分配律来求出上面的值。

Code#

#include <bits/stdc++.h>

#define x first
#define y second
#define IOS ios::sync_with_stdio(false)
#define cit cin.tie(0)
#define cot cout.tie(0)

using namespace std;

typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> PII;

const int N = 50010, M = 100010, MOD = 1e9 + 7;
const int INF = 0x3f3f3f3f;
const LL LLINF = 0x3f3f3f3f3f3f3f3f;
const double eps = 1e-8;

int primes[N], cnt;
bool st[N];
int mob[N], sum[N];

void solve();

void get_primes(int n)
{
    mob[1] = 1;
    for (int i = 2; i <= n; i ++ )
    {
        if (!st[i])
        {
            primes[cnt ++ ] = i;
            mob[i] = -1;
        }
        for (int j = 0; primes[j] <= n / i; j ++ )
        {
            int t = primes[j] * i;
            st[t] = true;
            if (i % primes[j] == 0) break;
            mob[t] = mob[i] * -1;
        }
    }

    for (int i = 1; i <= n; i ++ ) sum[i] = sum[i - 1] + mob[i];
}

int main()
{
    IOS;
    cit, cot;
    get_primes(N - 1);
    int T = 1;
    cin >> T;
    while (T -- ) solve();
    return 0;
}

void solve()
{
    int a, b, d;
    cin >> a >> b >> d;
    a /= d, b /= d;

    LL res = 0;
    for (int l = 1, r; l <= min(a, b); l = r + 1)
    {
        r = min(a / (a / l), b / (b / l));
        res += (sum[r] - (LL)sum[l - 1]) * (a / l) * (b / l);
    }
    cout << res << endl;
}
posted @   hcywoi  阅读(42)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
点击右上角即可分享
微信分享提示
主题色彩