#6474. 特殊数字计数 (Count Special)

特殊数字计数 (Count Special)

2020年编程奥林匹克竞赛:第二轮 (SACO 2020 Round 2)

竞赛规则摘要:

  • 答题时间:120 分钟(2 小时)。
  • 题目数量:共 4 题,每题 100 分。
  • 提交限制:每位选手最多提交 30 次。
  • 评分标准:每个子任务独立计分,取该子任务所有提交中的最高分。
  • 合规性:禁止访问外部网站,程序需通过查重检测。

题目 1:特殊数字计数 (Count Special)

属性 规格
输入文件 标准输入 (Standard Input)
输出文件 标准输出 (Standard Output)
时间限制 0.1 秒 (受语言系数影响)
内存限制 256 MB

题目描述

给定两个正整数 AABB。如果一个正整数能被 AABB(或同时被两者)整除,我们就称这个数为“特殊数字”。 请编写一个程序,计算在给定的整数 NN 之下(不包含 NN 本身),共有多少个特殊数字。

输入格式

输入包含 3 个以空格分隔的整数:A,B,NA, B, N

  • 1A,Bmin(N,106)1 \le A, B \le \min(N, 10^6)
  • 1N10181 \le N \le 10^{18}

输出格式

输出一个整数,代表小于 NN 的特殊数字的总数。

计分与子任务

  • 子任务 1 (0 分):样例测试。
  • 子任务 2 (80 分)1N1061 \le N \le 10^6
  • 子任务 3 (20 分)1N10181 \le N \le 10^{18}注意:需使用 64 位整数类型)。

算法思路:容斥原理 (Inclusion-Exclusion Principle)

计算小于 NN 且能被 AABB 整除的数字数量,可以使用经典的容斥原理:

  1. 计算小于 NN 且能被 AA 整除的个数:countA=(N1)/AcountA = \lfloor (N-1) / A \rfloor
  2. 计算小于 NN 且能被 BB 整除的个数:countB=(N1)/BcountB = \lfloor (N-1) / B \rfloor
  3. 注意重复:同时能被 AABB 整除的数(即能被 AABB最小公倍数整除的数)被计算了两次。
  4. 最小公倍数计算公式:LCM(A,B)=(A×B)/GCD(A,B)LCM(A, B) = (A \times B) / GCD(A, B)
  5. 最终结果:Ans=countA+countBAns = countA + countB - \lfloor (N1)/LCM(A,B)(N-1) / LCM(A, B) \rfloor