博客
关于我
莫比乌斯反演
阅读量:234 次
发布时间:2019-03-01

本文共 1709 字,大约阅读时间需要 5 分钟。

为了解决问题,我们需要计算满足条件的数对 (x, y),使得 1 ≤ x ≤ N,1 ≤ y ≤ M,且 gcd(x, y) 是素数。我们可以利用莫比乌斯函数和包含-排除原理来高效地解决这个问题。

方法思路

  • 预处理莫比乌斯函数:莫比乌斯函数 μ(n) 将平方自由数标记为 ±1,非平方自由数标记为 0。我们可以通过筛法预处理 μ 数组。
  • 遍历质数:对于每个质数 p,计算满足条件的数对 (x, y) 的数量。
  • 包含-排除原理:对于每个质数 p,计算满足 x 和 y 都被 p 整除,但不能被 p² 整除的数对数量。利用莫比乌斯函数来处理平方因子。
  • 累加结果:将所有质数对应的数对数量累加,得到最终结果。
  • 解决代码

    #include 
    using namespace std;const int maxm = 1e6 + 5;int notprime[maxm];int prime[maxm], cnt;int mu[maxm];void Minit() { mu[1] = 1; for (int i = 2; i < maxm; ++i) { if (!notprime[i]) { prime[cnt++] = i; mu[i] = -1; } for (int j = 0; j < cnt; ++j) { if (prime[j] * i > maxm) break; notprime[prime[j] * i] = 1; mu[prime[j] * i] = (i % prime[j]) ? -mu[i] : 0; if (i % prime[j] == 0) break; } }}int main() { Minit(); int t; cin >> t; while (t--) { int N, M; cin >> N >> M; if (N == 0 || M == 0) { cout << 0 << endl; continue; } long long ans = 0; for (int p = 0; p < cnt; ++p) { int current_p = prime[p]; long long sum_p = 0; for (int k = 1; ; ++k) { if ((long long)k * current_p > maxm) break; if (mu[k] == 0) continue; int multiple = current_p * k; int a = N / multiple; int b = M / multiple; sum_p += mu[k] * a * b; } ans += sum_p; } cout << ans << endl; } return 0;}

    代码解释

  • 预处理莫比乌斯函数:使用筛法初始化 μ 数组,标记平方自由数和质数。
  • 遍历质数:对于每个质数 p,计算满足条件的数对数量。
  • 包含-排除原理:通过遍历 k,计算满足条件的数对数量,并利用莫比乌斯函数处理平方因子。
  • 累加结果:将所有质数对应的数对数量累加,得到最终结果并输出。
  • 这种方法高效地利用了莫比乌斯函数和包含-排除原理,确保了计算的准确性和效率。

    转载地址:http://qtzv.baihongyu.com/

    你可能感兴趣的文章
    Objective-C实现PrimeFactors质因子分解算法 (附完整源码)
    查看>>
    Objective-C实现pythagoras哥拉斯算法(附完整源码)
    查看>>
    Objective-C实现qubit measure量子位测量算法(附完整源码)
    查看>>
    Objective-C实现quick select快速选择算法(附完整源码)
    查看>>
    Objective-C实现radians弧度制算法(附完整源码)
    查看>>
    Objective-C实现radianToDegree弧度到度算法(附完整源码)
    查看>>
    Objective-C实现radix sort基数排序算法(附完整源码)
    查看>>
    Objective-C实现rail fence围栏密码算法(附完整源码)
    查看>>
    Objective-C实现rayleigh quotient瑞利商算法(附完整源码)
    查看>>
    Objective-C实现RC4加解密算法(附完整源码)
    查看>>
    Objective-C实现recursive bubble sor递归冒泡排序算法(附完整源码)
    查看>>
    Objective-C实现recursive insertion sort递归插入排序算法(附完整源码)
    查看>>
    Objective-C实现recursive quick sort递归快速排序算法(附完整源码)
    查看>>
    Objective-C实现RedBlackTree红黑树算法(附完整源码)
    查看>>
    Objective-C实现redis分布式锁(附完整源码)
    查看>>
    Objective-C实现reverse letters反向字母算法(附完整源码)
    查看>>
    Objective-C实现ripple adder涟波加法器算法(附完整源码)
    查看>>
    Objective-C实现RodCutting棒材切割最大利润算法(附完整源码)
    查看>>
    Objective-C实现Romberg算法(附完整源码)
    查看>>
    Objective-C实现round robin循环赛算法(附完整源码)
    查看>>