首页 > 其他分享 >莫比乌斯函数(P3455 题解)

莫比乌斯函数(P3455 题解)

时间:2023-01-24 20:26:00浏览次数:49  
标签:lfloor right frac int 题解 rfloor P3455 莫比 left

题目链接

我们定义 \(n\) 的莫比乌斯函数为 \(\mu_n\)。

我们将 \(n\) 分解质因式后为 \(n = p_1^{\alpha_1}p_2^{\alpha_2}\cdots p_k^{\alpha_k}\) 则 \(\mu_n= \begin{cases}0\text{ 当 } \alpha_i > 1 \text{ 时}\\ 1\text{ 当 } k\text{ 为偶数时}\\ -1\text{ 当 } k\text{ 为奇数时} \end{cases}\)

\(\gcd(x, y)=d\),就等价于 \(\gcd(\frac{x}{d}, \frac{y}{d})=1\)。

即为找到 \(x^{'}, y^{'}\) 满足 \(x^{'}\le\left\lfloor\frac{a}{d}\right\rfloor, y^{'}\le \left\lfloor\frac{b}{d}\right\rfloor\) 和 \(\gcd(x^{'}, y^{'}) = 1\)。

假如不考虑条件 \(2\),我们令 \(a^{'}=\left\lfloor\frac{a}{d}\right\rfloor, b^{'}=\left\lfloor\frac{b}{d}\right\rfloor\)。则答案为 \(a^{'}b^{'}\)。

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

\[a^{'}b^{'}-S_2-S_3-S_5-\cdots\\ +S_6+S_{10}+S_{15}+\cdots\\ -S_{30}-\cdots\\ \]

其中 \(S_i\) 表示 \(\left\lfloor\frac{\min\{a^{'}, b^{'}\}}{i}\right\rfloor\) 即 \([1, \min\{a^{'}, b^{'}\}]\) 中所有 \(i\) 的倍数的个数。

然后根据上面 \(\mu\) 的定义可得答案为 \(a^{'}b^{'}+\sum\limits_{i=2}^{\min\{a^{'}, b^{'}\}}\left\lfloor\frac{a}{i}\right\rfloor\left\lfloor\frac{b}{i}\right\rfloor\mu_i\)。

然后我们可以从 \(\left\lfloor\frac{a}{i}\right\rfloor\left\lfloor\frac{b}{i}\right\rfloor\) 入手,我们发现必定可以分成若干个极大段,使得段内值相等。

我们考虑对于一个分数 \(\frac{a}{b}\),找到一个最大的整数 \(x\),满足 \(\left\lfloor\frac{a}{b}\right\rfloor=\left\lfloor\frac{a}{x}\right\rfloor\)。

则 \(x = \left\lfloor\frac{a}{\left\lfloor\frac{a}{b}\right\rfloor}\right\rfloor\)。

如果满足以上条件即满足 \(\left\lfloor\frac{a}{b}\right\rfloor=\left\lfloor\frac{a}{x}\right\rfloor\) 和 \(\left\lfloor\frac{a}{b}\right\rfloor > \left\lfloor\frac{a}{x+1}\right\rfloor\)。

证明条件 \(1\)。

\[x=\left\lfloor\frac{a}{\left\lfloor\frac{a}{b}\right\rfloor}\right\rfloor\ge \left\lfloor\frac{a}{\frac{a}{b}}\right\rfloor=b\\ x\ge b\\ \left\lfloor\frac{a}{b}\right\rfloor\ge\left\lfloor\frac{a}{x}\right\rfloor\\ \left\lfloor\frac{a}{x}\right\rfloor=\left\lfloor\frac{a}{\left\lfloor\frac{a}{{\left\lfloor\frac{a}{b}\right\rfloor}}\right\rfloor}\right\rfloor\ge\left\lfloor\frac{a}{\frac{a}{\left\lfloor\frac{a}{b}\right\rfloor}}\right\rfloor=\left\lfloor\frac{a}{b}\right\rfloor\\ \left\lfloor\frac{a}{b}\right\rfloor=\left\lfloor\frac{a}{x}\right\rfloor \]

证明条件 \(2\)。

设 \(a = kb + r\),其中 \(0\le r<x\)。

\[\left\lfloor\frac{a}{b}\right\rfloor=k>\left\lfloor\frac{a}{x+1}\right\rfloor=\left\lfloor\frac{a}{\left\lfloor\frac{a}{{\left\lfloor\frac{a}{b}\right\rfloor}}\right\rfloor+1}\right\rfloor=\left\lfloor\frac{a}{\left\lfloor\frac{a}{k}\right\rfloor+1}\right\rfloor\\ k>\left\lfloor\frac{a}{\left\lfloor\frac{a}{k}\right\rfloor+1}\right\rfloor\\ k>\frac{a}{\left\lfloor\frac{a}{k}\right\rfloor+1}\\ k(\left\lfloor\frac{a}{k}\right\rfloor+1)>a \]

在设 \(a=pk+q\),其中 \(0\le q<k\)。

\[k(\left\lfloor\frac{a}{k}\right\rfloor+1)>a\\ k(p+1)>pk+q\\ kp+k>pk+q\\ k>q\\ \]

从上面 \(0\le q < k\) 可知,\(k > q\)。

定理:将这些数分段段数必定是 \(\le \mathcal O(\sqrt{n})\) 的。

然后我们就可以每次跳到 \(\left\lfloor\frac{a}{i}\right\rfloor\left\lfloor\frac{b}{i}\right\rfloor\) 的末尾,再求出 \(\mu\) 的前缀和,然后根据分配律来求出上面的值。

\(\mathcal 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;
}

标签:lfloor,right,frac,int,题解,rfloor,P3455,莫比,left
From: https://www.cnblogs.com/hcywoi/p/17066325.html

相关文章

  • CF1726D 题解
    EdgeSplit。一开始nt了,以为红边为一颗树,蓝边为剩余边,蓝边就不会有环了。假设有\(n\)个点,\(m\)条边,且这些边没有出现环,那么连通块的数量为\(n-m\),因为不存在环,......
  • AT_abc285_e 题解
    WorkorRest。我们考虑相邻两个假期之间的工作效率和。设\(len\)为相邻两个假期间隔的天数。举个例子,如果假期为\(\{1,3,7\}\),那么\(len\)为\(\{1,4\}\)。根......
  • CF1768C 题解
    \(\mathcalSolution\)【题意】题目要你构造两个序列\(p,q\),满足\(\max\{p_i,q_i\}=a_i\)。【分析】如果满足\(\max\{p_i,q_i\}=a_i\),则满足\(p_i=a_i,q_i\le......
  • CF1768D 题解
    \(\mathcalSolution\)【题意】我们可以交换任意两个数,求最小操作几次能让逆序对变成\(1\)。【分析】如果逆序对为\(1\)的排列一定是:\(2,1,\cdotsn\)\(1,3,......
  • ABC281E 题解
    \(\mathcalSolution\)本题的思路类似于对顶堆。用两个multiset来维护。\(S_1\)为第一个multiset;\(S_2\)为第二个multiset。\(S_1\)维护前\(K\)个值,\(S_2\)......
  • AT_abc277_e 题解
    \(\mathcalSolution\)【题意】给定无向图,当\(a_i=1\)时,该条边才能走。在给我们\(k\)个点,\(S_1,S_2,\cdots,S_k\),到了这些点可以选择是否取反\((1\to0,0\t......
  • 2023牛客寒假算法基础集训营1 个人题解(ACDHKL)
    A.WorldFinal?WorldCup!(I)题意:给10场比赛的点球输赢情况,奇数为A队点球,偶数为B队点球思路:用两个变量x,y来分别存A队当前赢的场次和B队当前赢的场次然后就就扫......
  • CodeForces-907#B 题解
    正文设数组\(c_{x,y,i,j}\)代表\((x,y)\)位置的大格子中\((i,j)\)位置的小格子。很显然,输入中字符的输入顺序是要调整的,实际的顺序是\(x,i,y,j\)。对于输入的\(......
  • 题解
    前言只对SubTask2的选手看过来!!!很好的一道模拟题。坑点分析题目里说的很明白了:只要有\(\ge1\)个带有注释的,就是一定是祖宗人,哪怕在后面或者前面出现过符合乐子人......
  • P3802 小魔女帕琪 题解【期望dp】
    题目传送门P3802解题思路本题的解题思路关键在于分段。每一个结构段的概率在之后的结构段依然适用。判断是否符合这种特性最好方法是随机截取一段观察是否成立发现成......