第十四届蓝桥杯大赛软件赛省赛Python-研究生组-D.互质数的个数

问题描述

给定 a,b,求 1≤x< a b a^b ab 中有多少个 x 与 ab 互质。由于答案可能很大,你只需要输出答案对 998244353 取模的结果。

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

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

样例输入 1
2 5
样例输出 1
16

样例输入 2
12 7
样例输出 2
11943936

评测用例规模与约定

对于 30% 的评测用例,ab≤ 1 0 6 10^6 106

对于 70% 的评测用例,a≤ 1 0 6 10^6 106,b≤ 1 0 9 10^9 109

对于所有评测用例,1<a≤ 1 0 9 10^9 109,1≤b≤ 1 0 18 10^{18} 1018


题解

暴力求解思路不可取。
面对求互质问题,可采用欧拉函数进行求解。欧拉函数的形式为 φ ( a ) \varphi (a) φ(a),表示小于等于n且与n互质的正整数的个数。
题目中要求区间[1, a b a^b ab)中与 a b a^b ab互质的整数的个数,即求解 φ ( a b ) \varphi (a^b) φ(ab)
因此,当 a b a^b ab=1时,答案为0( φ ( 1 ) \varphi (1) φ(1)=1);其他情况下答案为 φ ( a b ) \varphi (a^b) φ(ab)

对于 φ ( a b ) \varphi (a^b) φ(ab)的求解:
考虑到与质数相关,想到算术基本定理,将 a b a^b ab分解为质数连乘的形式: a b = ( p 1 α 1 p 2 α 2 … p m α m ) b = ∏ i = 1 m p b ⋅ α i {a^b} = {(p_1^{{\alpha _1}}p_2^{{\alpha _2}} \ldots p_m^{{\alpha _m}})^b} = \prod\limits_{i = 1}^m {{p^{b \cdot {\alpha _i}}}} ab=(p1α1p2α2pmαm)b=i=1mpbαi p i p_i pi均为质数)。
故有:
φ ( a b ) = ∏ i = 1 m φ ( p b ⋅ α i ) = ∏ i = 1 m p i b ⋅ α i − 1 φ ( p i ) = ∏ i = 1 m p i b ⋅ α i − 1 ( p i − 1 ) = ∏ i = 1 m p i b ⋅ α i ( 1 − 1 p i ) = ∏ i = 1 m p i b ⋅ α i ∏ i = 1 m p ( 1 − 1 p i ) = a b ∏ i = 1 m p ( 1 − 1 p i ) = a b − 1 a ∏ i = 1 m p ( 1 − 1 p i ) \begin{array}{c} \varphi \left( {{a^b}} \right) = \prod\limits_{i = 1}^m {\varphi \left( {{p^{b \cdot {\alpha _i}}}} \right)} = \prod\limits_{i = 1}^m {p_i^{b \cdot {\alpha _i} - 1}\varphi \left( {{p_i}} \right)} = \prod\limits_{i = 1}^m {p_i^{b \cdot {\alpha _i} - 1}\left( {{p_i} - 1} \right)} \\ = \prod\limits_{i = 1}^m {p_i^{b \cdot {\alpha _i}}\left( {1 - \frac{1}{{{p_i}}}} \right)} = \prod\limits_{i = 1}^m {p_i^{b \cdot {\alpha _i}}} \prod\limits_{i = 1}^m {p\left( {1 - \frac{1}{{{p_i}}}} \right)} = {a^b}\prod\limits_{i = 1}^m {p\left( {1 - \frac{1}{{{p_i}}}} \right)} \\ = {a^{b - 1}}a\prod\limits_{i = 1}^m {p\left( {1 - \frac{1}{{{p_i}}}} \right)} \end{array} φ(ab)=i=1mφ(pbαi)=i=1mpibαi1φ(pi)=i=1mpibαi1(pi1)=i=1mpibαi(1pi1)=i=1mpibαii=1mp(1pi1)=abi=1mp(1pi1)=ab1ai=1mp(1pi1)
其中, a b − 1 a^{b-1} ab1可通过快速幂求出, a ∏ i = 1 m p ( 1 − 1 p i ) a\prod\limits_{i = 1}^m {p\left( {1 - \frac{1}{{{p_i}}}} \right)} ai=1mp(1pi1)极为 φ ( a ) \varphi (a) φ(a)

代码

import os
import sys

# 请在此输入您的代码
import math

mod = 998244353

a, b = map(int, input().split())
if a == 1 or b == 0:
    print(0)
    exit()
ans = pow(a, b - 1, mod)
phi = a
for i in range(2, int(a ** 0.5 + 1)):
    if a % i == 0:
        phi = phi // i * (i - 1)
        while a % i == 0:
            a //= i
if a > 1:
    phi = phi // a * (a - 1)
ans = ans * phi % mod

print(ans)

  • 27
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值