当前位置:   article > 正文

【欧拉函数+快速幂】第十四届蓝桥杯省赛C++ C组 Java A组/研究生组 Python 研究生组《互质数的个数》(C++)

【欧拉函数+快速幂】第十四届蓝桥杯省赛C++ C组 Java A组/研究生组 Python 研究生组《互质数的个数》(C++)

【题目描述】

给定 a,b,求 1≤x<a^{b} 中有多少个 x 与 a^{b} 互质。

由于答案可能很大,你只需要输出答案对 998244353 取模的结果。

【输入格式】

输入一行包含两个整数分别表示 a,b,用一个空格分隔。

【输出格式】

输出一行包含一个整数表示答案。

【数据范围】

对于 30% 的评测用例,a^{b}10^{6}
对于 70% 的评测用例,a≤10^{6},b≤10^{9}
对于所有评测用例,1≤a≤10^{9},1≤b≤10^{18}

【输入样例1】

2 5

【输出样例1】

16

【输入样例2】

12 7

【输出样例2】

11943936

对欧拉函数不清楚的可以参考【模板】AcWing873. 《欧拉函数》(C++)

【代码】

  1. #include <iostream>
  2. #include <cstring>
  3. #include <algorithm>
  4. using namespace std;
  5. typedef long long LL;
  6. const int MOD = 998244353;
  7. LL qmi(LL a, LL b)
  8. {
  9. LL res = 1;
  10. while (b)
  11. {
  12. if (b & 1) res = res * a % MOD;
  13. a = a * a % MOD;
  14. b >>= 1;
  15. }
  16. return res;
  17. }
  18. int main()
  19. {
  20. LL a, b;
  21. cin >> a >> b;
  22. if (a == 1)
  23. {
  24. cout << 0 << endl;
  25. return 0;
  26. }
  27. LL res = a, x = a;
  28. for (int i = 2; i * i <= x; i ++ )
  29. if (x % i == 0)
  30. {
  31. while (x % i == 0) x /= i;
  32. res = res / i * (i - 1);
  33. }
  34. if (x > 1) res = res / x * (x - 1);
  35. cout << res * qmi(a, b - 1) % MOD << endl;
  36. return 0;
  37. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/300522
推荐阅读
相关标签
  

闽ICP备14008679号