1 条题解
-
0
题意分析
- 问题定义:
- 给定,求所有与互质的正整数组成的升序序列中的第项。
- 关键性质:
- 与互质的数具有周期性,周期为(欧拉函数)。
解题思路
- 欧拉函数预处理:
- 计算,表示中与互质的数的个数。
- 周期定位:
- 第个数可表示为:
- 在范围内寻找第个互质数
- 二分搜索:
- 对候选数,统计中与互质的数的数量
- 使用容斥原理计算互质数数量
实现步骤
- 分解质因数:
- 对进行质因数分解,得到所有素因子
- 容斥计算:
- 对于给定,计算中能被的任一素因子整除的数的个数
- 互质数数量 = - 被至少一个素因子整除的数的个数
- 二分框架:
- 在范围内二分查找满足条件的
- 结果验证:
- 检查是否确实是与互质的第个数
代码实现
#include<cstdio> using namespace std; typedef long long ll; const int maxm = 1000005; int gcd(int a, int b) { return 0 == b ? a : gcd(b, a%b); } int a[maxm]; int main() { int m, k; while (scanf("%d%d", &m, &k) == 2) { int cnt = 0; for (int i = 1; i <= m; ++i) { if (gcd(m, i) == 1) { a[cnt++] = i; } } ll ans = a[(k - 1) % cnt];//下标从0开始,k-1向前偏移一位 ans += (ll)m*(ll)((k - 1) / cnt); printf("%lld\n", ans); } return 0; }
- 问题定义:
- 1
信息
- ID
- 1773
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者