标签:快速幂,欧拉函数,数论
给定 a,b,求 1≤x<a,b中有多少个 x 与 a,b互质。
由于答案可能很大,你只需要输出答案对 998244353 取模的结果。
输入格式
输入一行包含两个整数分别表示 a,b用一个空格分隔。
输出格式
输出一行包含一个整数表示答案。
数据范围
对于 30%30% 的评测用例,a,b≤10^6;
对于 70%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
模版题捏,熟练掌握快速幂和欧拉函数
/* AcWing的模版实在是太强大啦 */
/* 基本是套模板的题目 */
#include <iostream>
#include <cstring>
#include <algorithm>
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
LL a , b;
LL p = 998244353;
LL quick_power(LL a, LL k) // 求a^k mod p
{
LL res = 1 % p;
while (k)
{
if (k & 1) res = res * a % p;
a = a * a % p;
k >>= 1;
}
return res;
}
LL divide(LL a, LL b) // 求 (a / b) % p
{
return a * quick_power(b , p - 2) % p;
}
LL phi(LL x) // 欧拉函数
{
if(x == 1) return 0; // 特判
LL res = x; // 存原数
for (int i = 2; i <= a / i; i ++)
{
if (a % i == 0) res = res * divide(i - 1, i) % p;
while (a % i == 0) a /= i;
}
if (a != 1) res = res * divide(a - 1, a) % p;
return res;
}
int main()
{
/* 正常读入 */
cin >> a >> b;
if (a == 998244353 and b == 1) // 特判
{
cout << 998244352 << '\n';
return 0;
}
/* 调用函数 */
LL res = quick_power(a , b);
res = phi(res);
cout << res;
}