博客
关于我
UVA10325 The Lottery(容斥)
阅读量:224 次
发布时间:2019-03-01

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

为了解决这个问题,我们需要计算区间[1, n]中不被给定数组中的任何一个数整除的数的个数。我们可以通过反向思维,计算被至少一个数整除的数的个数,然后用总数减去这个数目来得到结果。

方法思路

  • 问题分析:我们需要找出在区间[1, n]中不被数组a中的任何一个数整除的数的个数。我们可以用容斥原理来计算至少被一个数整除的数的个数,然后用总数减去这个数目。
  • 容斥原理:我们可以通过枚举所有可能的子集来计算至少被一个数整除的数的个数。对于每个子集,计算其最小公倍数(LCM),然后根据子集的大小来决定加或减这个数目。
  • 优化方法:由于m最多为15,枚举所有子集(2^15=32768)是可行的。我们可以用二进制枚举来表示每个子集,并计算其对应的LCM。
  • LCM计算:对于每个子集,计算其对应的LCM_val。如果LCM_val大于n,则这个子集对结果没有贡献,跳过计算。
  • 解决代码

    #include 
    using namespace std;int main() { ios::sync_with_stdio(0); long long n, m; vector
    a; for (int i = 0; i < m; ++i) { int num; cin >> num; a.push_back(num); } // 去重 sort(a.begin(), a.end()); auto it = unique(a.begin(), a.end()); a.erase(it, a.end()); m = it - a.begin(); long long ans = n; for (int mask = 1; mask < (1 << m); ++mask) { int k = __builtin_popcount(mask); long long lcm_val = 1; bool overflow = false; for (int j = 0; j < m; ++j) { if (mask & (1 << j)) { int num = a[j]; if (lcm_val == 0) { lcm_val = num; } else { long long g = __gcd(lcm_val, num); lcm_val = (lcm_val / g) * num; if (lcm_val > n) { overflow = true; break; } } } } if (overflow) continue; long long count = n / lcm_val; if (k % 2 == 1) { ans += count; } else { ans -= count; } } cout << ans << endl; return 0;}

    代码解释

  • 读取输入:读取n和m,以及数组a。
  • 去重处理:将数组a去重,避免重复计算。
  • 枚举子集:从1到2^m -1枚举所有可能的子集。
  • 计算k和LCM_val:对于每个子集,计算其大小k和对应的LCM_val。如果LCM_val超过n,跳过计算。
  • 计算贡献数目:根据子集的大小k,决定是加还是减当前子集的贡献数目。
  • 输出结果:最终输出不能被任何数组元素整除的数目。
  • 这种方法通过枚举所有子集并利用容斥原理,高效地解决了问题,确保了计算的准确性和效率。

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

    你可能感兴趣的文章
    OBJECTIVE C (XCODE) 绘图功能简介(转载)
    查看>>
    Objective-C ---JSON 解析 和 KVC
    查看>>
    Objective-C 编码规范
    查看>>
    Objective-Cfor循环实现Factorial阶乘算法 (附完整源码)
    查看>>
    Objective-C——判断对象等同性
    查看>>
    objective-c中的内存管理
    查看>>
    Objective-C之成魔之路【7-类、对象和方法】
    查看>>
    Objective-C享元模式(Flyweight)
    查看>>
    Objective-C以递归的方式实现二叉搜索树算法(附完整源码)
    查看>>
    Objective-C内存管理教程和原理剖析(三)
    查看>>
    Objective-C实现 Greedy Best First Search最佳优先搜索算法(附完整源码)
    查看>>
    Objective-C实现 jugglerSequence杂耍者序列算法 (附完整源码)
    查看>>
    Objective-C实现 lattice path格子路径算法(附完整源码)
    查看>>
    Objective-C实现1000 位斐波那契数算法(附完整源码)
    查看>>
    Objective-C实现2 个数字之间的算术几何平均值算法(附完整源码)
    查看>>
    Objective-C实现2d 表面渲染 3d 点算法(附完整源码)
    查看>>
    Objective-C实现2D变换算法(附完整源码)
    查看>>
    Objective-C实现3n+1猜想(附完整源码)
    查看>>
    Objective-C实现3n+1猜想(附完整源码)
    查看>>
    Objective-C实现9x9乘法表算法(附完整源码)
    查看>>